Schreibe ein Programm, das "2+2=5" ausgibt!

  • Nein, ein einfaches main = putStrLn "2+2=5" :: IO () ist nicht gemeint.
    Es geht darum, ein Programm zu schreiben, von dem man meint, es berechnet 2+2, das Ergebnis am Ende aber 5 lautet. Das ganze soll zum einen erstmal funktionieren und als Bonus noch so wirr wie möglich sein.

    Ich hab hier mal ein Beispiel:

    Code
    #include "stdio.h"
    
    
    int main(void)
    {
            int twoplustwo = 2 + 2;
            printf("2 + 2 = %d\n", twоplustwo);
            return 0;
    }
    Zitat

    [0 running job(s)] {history#9284} 17:07:18 2014-10-28qsuscs@tatooine /tmp/tmp.MOEpELaRMe % cat foo.c #include "stdio.h"

    int main(void){ int twoplustwo = 2 + 2; printf("2 + 2 = %d\n", twоplustwo); return 0;}[0 running job(s)] {history#9285} 17:07:23 2014-10-28qsuscs@tatooine /tmp/tmp.MOEpELaRMe % clang foo.c -o foo[0 running job(s)] {history#9286} 17:07:26 2014-10-28qsuscs@tatooine /tmp/tmp.MOEpELaRMe % ./foo2 + 2 = 5

    PGP-Key E384 009D 3B54 DCD3 21BF  9532 95EE 94A4 3258 3DB1 | S/MIME-Key 0x1A33706DAD44DA
    G d-@ s+:- a--- C+++ UB+L++ P--- L++@ E-@>++ W+ N o? K? w>++ !O !M !V PS+++ PE-- Y+>++ PGP++>+++ !t 5? X? !R tv b+++>++++ DI !D G>+ e>+++ h !r>++ !z
    „Die Aachener gelten als Erfinder des 4. Hauptsatzes der Thermodynamik: ‚Thermo schreibt man zweimal.“‘
    “Saying that Java is good because it works on all platforms is like saying oral sex is good because it works on all sexes.”
    „Es gibt 10 Sorten von Leuten: Die einen verstehen das Binärsystem, die anderen nicht.“
    „Manche Männer lieben Männer, Manche Frauen eben Frauen; Da gibt's nix zu bedauern und nichts zu staunen; Das ist genau so normal wie Kaugummi kauen; Doch die meisten werden sich das niemals trauen“

    Einmal editiert, zuletzt von thosch97 (28. Oktober 2014 um 17:07)


  • cat stdio.h

    #include <stdio.h>
    int twоplustwo = 5;

    PGP-Key E384 009D 3B54 DCD3 21BF  9532 95EE 94A4 3258 3DB1 | S/MIME-Key 0x1A33706DAD44DA
    G d-@ s+:- a--- C+++ UB+L++ P--- L++@ E-@>++ W+ N o? K? w>++ !O !M !V PS+++ PE-- Y+>++ PGP++>+++ !t 5? X? !R tv b+++>++++ DI !D G>+ e>+++ h !r>++ !z
    „Die Aachener gelten als Erfinder des 4. Hauptsatzes der Thermodynamik: ‚Thermo schreibt man zweimal.“‘
    “Saying that Java is good because it works on all platforms is like saying oral sex is good because it works on all sexes.”
    „Es gibt 10 Sorten von Leuten: Die einen verstehen das Binärsystem, die anderen nicht.“
    „Manche Männer lieben Männer, Manche Frauen eben Frauen; Da gibt's nix zu bedauern und nichts zu staunen; Das ist genau so normal wie Kaugummi kauen; Doch die meisten werden sich das niemals trauen“

  • Oh, das ist auch schön, grad im Interweb gefunden (GCC nutzen):

    Code
    #include <stdio.h>
    
    
    int main(void)
    {
            int a=3, b=2;
            printf("%d + %d = %d", --a, b, a+b);
            return 0;
    }

    PGP-Key E384 009D 3B54 DCD3 21BF  9532 95EE 94A4 3258 3DB1 | S/MIME-Key 0x1A33706DAD44DA
    G d-@ s+:- a--- C+++ UB+L++ P--- L++@ E-@>++ W+ N o? K? w>++ !O !M !V PS+++ PE-- Y+>++ PGP++>+++ !t 5? X? !R tv b+++>++++ DI !D G>+ e>+++ h !r>++ !z
    „Die Aachener gelten als Erfinder des 4. Hauptsatzes der Thermodynamik: ‚Thermo schreibt man zweimal.“‘
    “Saying that Java is good because it works on all platforms is like saying oral sex is good because it works on all sexes.”
    „Es gibt 10 Sorten von Leuten: Die einen verstehen das Binärsystem, die anderen nicht.“
    „Manche Männer lieben Männer, Manche Frauen eben Frauen; Da gibt's nix zu bedauern und nichts zu staunen; Das ist genau so normal wie Kaugummi kauen; Doch die meisten werden sich das niemals trauen“

  • Einmal editiert, zuletzt von gandro (28. Oktober 2014 um 19:09)

  • Mal - von mir als Nicht-Programmierer - 'ne Frage: Welchen Sinn soll das Ganze denn haben?

    «Ich verstehe Ihre Frage so: Dass es Menschen gibt, die wünschen, dass ein solches OS als "Retro-OS" bezeichnet wird, ja? Mir ist nicht bekannt, dass solche Absichten bestehen, da HP-UX 9.x einfach ein altes OS ist. Niemand hat die Absicht, ein "Retro-OS" zu bauen.» Xaar, 2014

    Prozessor gesucht? -> Prozessoren, die ich abgeben kann (unter "Available for trading")
    "Überschüssige" Prozessoren oder Hardware? -> Einfach PN an mich schicken :b1: -> Hardware, die ich suche


  • Spass an der Freude..

    Aha, okay.

    Den Rest versteh' ich nicht :D

    «Ich verstehe Ihre Frage so: Dass es Menschen gibt, die wünschen, dass ein solches OS als "Retro-OS" bezeichnet wird, ja? Mir ist nicht bekannt, dass solche Absichten bestehen, da HP-UX 9.x einfach ein altes OS ist. Niemand hat die Absicht, ein "Retro-OS" zu bauen.» Xaar, 2014

    Prozessor gesucht? -> Prozessoren, die ich abgeben kann (unter "Available for trading")
    "Überschüssige" Prozessoren oder Hardware? -> Einfach PN an mich schicken :b1: -> Hardware, die ich suche

  • Dieses Programm gibt alles mögliche außer dem richtigen Ergebnis aus.


  • (20:35:21) DosAmp: (ich hab ehrlich gerade keinen plan, woran es liegt, dass mein c-programm uninitialisierten speicher liest und verarbeitet)


    Das Problem hier ist, dass die Evaluationsreihenfolge von "numbers[++i] = numbers[i]" nicht definiert ist. Der Assignment-Operator ( = ) in C ist kein Sequence-Point (+ übrigens auch nicht), das heisst der C-Compiler darf selber entschieden, welchen Ausdruck er wann evaluiert. Gleiches Phänomen wie thosch97 sein zweites Beispiel.

    Es wird also von deinem Compiler folgendes ausgeführt. Andere Compiler können das anders interpretieren.

    Code
    while (i < 6) {
        /* um eins erhöhen und in den Nachfolger schreiben */
        int tmp = ++i;
        numbers[tmp] = numbers[i] + 1;
      }


    Nachtrag: Ausserdem macht das hier nen Zugriff auf numbers[6], also ausserhalb des Arrays, was auch böse ist.

    Einmal editiert, zuletzt von gandro (28. Oktober 2014 um 21:14)


  • Wie wirkt sich in dem Fall denn son , aus?


    Ein Ausdruck "x,y" berechnet zuerst x, verwirft das Resultat; berechnet dann y und gibt das zurück.

    printf("%d\n", (1+1, 2+2, 3+3)) berechnet zuerst 1+1, dann 2+2, dann 3+3 und übergibt dann 6 (=3+3) dem printf.

    (2,0 + 2,0) berechnet also zuerst 2, dann 2+0, dann 0 und verwendet 0 für die Ausgabe.

    Nachtrag. Zu den Warnungen, stimmt, doch nicht ganz standard-konform weil ich einen Integer als Float ausgebe.
    Korrekterweise müsste man printf("%f", (float) (2,0 + 2,0)) oder printf("%d", (2,0 + 2,0)) schreiben. Da 0 aber auch 0.0 in Float ist, funktioniert es.

    Einmal editiert, zuletzt von gandro (28. Oktober 2014 um 21:39)


  • Wie wirkt sich in dem Fall denn son , aus?

    1. "2" wird evaluiert und weggeschmissen.
    2. "0 + 2" wird evaluiert und weggeschmissen.
    3. "0" wird evaluiert und zurückgegeben. Zufälligerweise passt ein 32-Bit-Integer von der Größe her zu einem Float einfacher Genauigkeit (bzw. haben 0 und 0.0f dieselbe Repräsentation), weswegen printf keinen groben Unfug baut.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!