In dem Ausdruck
a = a-- + a--;
Sie haben viele Unterausdrücke, die ausgewertet werden müssen, bevor der gesamte Ausdruck ausgewertet wird.
a = a-- + a--;
^^^ <= sub-expression 2
^^^ <= sub-expression 1
Was ist der Wert des Unterausdrucks 1? Es ist der aktuelle Wert des Objekts a
.
Was ist der Wert des Objekts a
?
Wenn der Unterausdruck 2 bereits ausgewertet wurde, wird der Wert des Objekts a
ist 9, sonst ist es 10.
Dasselbe gilt für den Unterausdruck 2. Sein Wert kann entweder 9 oder 10 sein, je nachdem, ob Unterausdruck 1 bereits ausgewertet wurde.
Der C-Compiler (weiß nicht, wie es mit Java aussieht) kann die Teilausdrücke in beliebiger Reihenfolge auswerten
Nehmen wir also an, der Compiler hat sich dafür entschieden, die --
s zum Schluss
a = 10 + 10;
a--; /* 19 */
a--; /* 18 */
aber bei der nächsten Kompilierung hat der Compiler die --
s im Vordergrund
/* value of sub-expression 1 is 10 */
/* value of sub-expression 2 is 9 */
a = 10 + 9; /* a = 9 + 10; */
oder es könnte sogar eine der a--
und verwenden Sie dies für den endgültigen Wert von a
/* sub-expression 1 yields 10 and sets the value of `a` to 9 */
/* so yield that 10, but save the value for the end */
a = 10 + ???;
a = 18???; a = 19???;
/* remember the saved value */
a = 9
Da Sie ein undefiniertes Verhalten aufgerufen haben, könnte es Ihre Anweisung einfach durch eine der folgenden ersetzen
- a = 42;
- /* */
- fprintf(stderr, "BANG!");
- system("Format C:");
- for (p=0; p<MEMORY_SIZE; p++) *p = 0;
- usw. ...
0 Stimmen
Sieht aus wie: a=a++; ==> tmp=a; a=a+1; a=tmp;
0 Stimmen
Ok, was ist mit a=a++; für a=10, was sollte die Ausgabe sein?
0 Stimmen
Hey Leute, was ist mit dem letzten Teil der Frage? a=10; a=a++; ...print a zeigt 10 als Ausgabe? sollte es nicht 11 sein?