In-/Dekrementierung-Logische Verknüpfungen



  • Hallo zusammen,

    ich stehe vor folgender aufgabe und verstehe einfach nicht, warum das programm als lösung erg=0, i=1, j=0 ausgibt. meiner meinung nach müsste dort erg=0,i=1,j=1 als ergebnis rauskommen. natürlich gehe ich davon aus, das die compiler lösung die richtige ist, aber warum??

    #include <stdio.h>

    void main ()
    {
    int i,j,erg;

    i=j=0;
    erg=i++ && j++;
    printf("erg=%d i=%d j=%d \n",erg,i,j);

    return 0;

    }

    gruss Defyne



  • verwende post-inkrement operator

    ++i;
    


  • electric_juice schrieb:

    verwende post-inkrement operator

    ++i;
    

    ich möchte aber nicht ein bestimmtes ergebnis haben, sondern ich möchte dir richtige lösung des oben genannten programms wissen- am besten mit erklärung 🙂



  • i++ && j++
    wertet j++ nicht aus, weil && abkürzt, sobald das ergebnis feststeht.



  • erg=i++ && j++;
    

    Es wird zuerst der Linke Teil von && ausgewertet, dann der rechte. Da i zu diesem Zeitpunkt aber noch 0 ist, also logisch false, wird j++ überhaupt nichtmehr ausgewertet, da das Ergebnis der logischen Verundung bereits feststeht.



  • TactX schrieb:

    erg=i++ && j++;
    

    Es wird zuerst der Linke Teil von && ausgewertet, dann der rechte.

    das habe ich soweit verstanden. es wird sofort abgebrochen weil i=0 und damit kann die logische verknüpfung niemals true sein.

    Da i zu diesem Zeitpunkt aber noch 0 ist, also logisch false, wird j++ überhaupt nichtmehr ausgewertet, da das Ergebnis der logischen Verundung bereits feststeht.

    warum wird aber nur i=1 gesetzt und nicht auch j=1. liegt der grund darin, das nach dem abbruch das j quasi gar nicht "sichtbar" ist für den compiler? also das j wird auch bei der postinkrementierung gar nicht beachtet?!



  • Defyne schrieb:

    warum wird aber nur i=1 gesetzt und nicht auch j=1. liegt der grund darin, das nach dem abbruch das j quasi gar nicht "sichtbar" ist für den compiler? also das j wird auch bei der postinkrementierung gar nicht beachtet?!

    so ähnlich. der compiler erzeugt code, der das j++ überspringt wenn i==0 ist. deshalb sollte man solche codes auch besser meiden, weil die ziemlich unleserlich sind.



  • okay, danke für die schnelle hilfe 👍


Anmelden zum Antworten