was passiert hier genau?



  • Der Kommaoperator macht nichts ausser den rechtesten Ausdruck zurückgeben (und natürlich alle anderen Ausdrücke auswerten)... Hier c.rackwitz' Beispiel mal etwas krasser:

    int i = (NULL, printf("Hallo, Welt\n"), 134); // i ist jetzt 134 UND auf dem Bildschirm ercheint "Hallo, Welt"
    


  • (1,2) > (4,5)
    wird so gelesen:
    2 > 5

    von den listen werden die ersten elemente ausgefuehrt/ausgewertet, aber nur vom letzten wird das ergebnis benutzt.



  • c.rackwitz schrieb:

    (1,2) > (4,5)
    wird so gelesen:
    2 > 5

    von den listen werden die ersten elemente ausgefuehrt/ausgewertet, aber nur vom letzten wird das ergebnis benutzt.

    Alles klar, vielen Dank euch!



  • Nebenbei - nach der Arbeit des Präprozessors steht dort nicht "(1,2)>(2,4)", sondern "(++cnt,2)>(++cnt,4)" - und dieses ++cnt wird überall dort ausgeführt, wo es im fertig übersetzten Programm auftaucht.

    #define maxm(x,y) ((x) > (y) ? (x) : (y))
    #define eval(x) (++cnt, (x))
    long f[] = {0,+2,-4,+6,-8};
    
    cnt = 0;
    res = maxm(maxm(eval(f[1]),eval(f[2])), eval(f[3]) );
    
    res = maxm(maxm((++cnt,(f[1])),(++cnt,(f[2]))), (++cnt,(f[3])) );
    
    res = maxm(((++cnt,(f[1]))>(++cnt,(f[2])) ? (++cnt,(f[1]) : (++cnt,(f[2])), (++cnt,(f[3])) );
    
    res = (((++cnt,(f[1]))>(++cnt,(f[2])) ? (++cnt,(f[1]) : (++cnt,(f[2]))>(++cnt,(f[3])) ? ((++cnt,(f[1]))>(++cnt,(f[2])) ? (++cnt,(f[1]) : (++cnt,(f[2])) : (++cnt,(f[3])))
    

    bis hierher war das sture Makro-Ersetzung, als nächstes kürze ich ein paar Klammern und setze die f[..]-Werte ein:

    res = ( (++cnt,2)>(++cnt,-4)?(++cnt,2):(++cnt,-4) )>(++cnt,6) ? ((++cnt,2)>(++cnt,-4)?(++cnt,2):(++cnt,-4)) : (++cnt,6)
    

    Und jetzt kommt der entscheidende Punkt - dieser Ausdruck wird ausgewertet:

    res = ( (++cnt,2)>(++cnt,-4)?(++cnt,2):(++cnt,-4) )>(++cnt,6) ? ((++cnt,2)>(++cnt,-4)?(++cnt,2):(++cnt,-4)) : (++cnt,6)
          (     2    >   -4     ?    2    :   ---     )>    6     ?                    ---                      :     6
    

    Punkt 1: Der Gesamtwert des Ausdrucks ist 6.
    Punkt 2: Während der Berechnung wird 5 mal ++cnt ausgeführt, also hat cnt (normalerweise) den Endwert 5
    Punkt 3: Die Reihenfolge der Nebeneffekte ist undefiniert, also könnte sich da auch etwas überlagern



  • Jo, hab ich auch rausbekommen. Aber danke für die Ausführliche Antwort 🙂



  • erklaerungswut, der schwache moment eines jeden lehrers. einfach ausnutzbar durch viele schnell gestellte komplizierte fragen, die ausschweifende antworten benoetigen. 🤡



  • c.rackwitz schrieb:

    erklaerungswut, der schwache moment eines jeden lehrers. einfach ausnutzbar durch viele schnell gestellte komplizierte fragen, die ausschweifende antworten benoetigen. 🤡

    So kann man es auch formulieren 🕶 und dabei bin ich nichtmal Lehrer.



  • c.rackwitz schrieb:

    erklaerungswut

    naja, aber dein homepage ist das bescheuertste was ich je gesehen habe...



  • net schrieb:

    naja, aber dein homepage ist das bescheuertste was ich je gesehen habe...

    suchst du streit?



  • c.rackwitz schrieb:

    net schrieb:

    naja, aber dein homepage ist das bescheuertste was ich je gesehen habe...

    suchst du streit?

    nee, das war nur ne nüchterne feststellung meinerseits. was blöderes hab ich noch nicht gesehen. aber das ist ja gschmackssache...


Anmelden zum Antworten