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