Kann mir bitte jemand erklären, warum das Ergebnis des folgenden Codes 9 ist? Ich bin wirklich verwirrt ..C Reihenfolge der Operationen?
#include <stdio.h>
int main (void)
{
int a = 3, rez;
rez = a-- + (-3) * (-2);
return 0;
}
Kann mir bitte jemand erklären, warum das Ergebnis des folgenden Codes 9 ist? Ich bin wirklich verwirrt ..C Reihenfolge der Operationen?
#include <stdio.h>
int main (void)
{
int a = 3, rez;
rez = a-- + (-3) * (-2);
return 0;
}
Der Ausdruck
rez = a-- + (-3) * (-2)
ist als
geparstres = ((a--) + ((-3) * (-2)))
und ausgewertet als „das Ergebnis von a--
wird auf das Ergebnis der (-3) * (-2)
hinzugefügt, und das Endergebnis zugeordnet ist, zu res
".
Postfix --
hat eine höhere Priorität als unären -
, die eine höhere Priorität als binäres *
hat, die höhere Priorität als binäres +
hat, die höhere Priorität als =
hat.
Beachten Sie, dass Vorrang und Reihenfolge der Auswertung ist nicht die gleiche Sache - es ist nicht garantiert, dass a--
vor (-3) * (-2)
ausgewertet wird, oder dass -3
vor -2
ausgewertet wird; Alles, was garantiert ist, ist, dass das Ergebnis von (-3) * (-2)
bekannt ist, bevor es zum Ergebnis von a--
hinzugefügt werden kann.
Futhermore, die Nebenwirkung vona--
muss nicht sofort nach der Bewertung angewandt werden. Dies bedeutet, dass die folgenden ein absolut gültige Reihenfolge der Operationen ist:
t1 = a
t2 = -2
t2 = t2 * -3
res = t1 + t2
a = a - 1
Es ist wegen der Reihenfolge der Operationen:
IIRC, Multiplikation geht 1., dann hinaus so
rez= a-- + (-3)* (-2);
zu Wertet:
rez= ((-3) * (-2)) + a--;
rez= 6 + a--;
rez= 6 + 3;
rez= 9;
a -= 1;
Ein Teil davon ist, weil Sie die Postfix-Form von --
verwenden, was bedeutet, dass Sie zuerst den aktuellen Ausdruck, und dann Dekrement auswerten.
Hinweis: Das 'a -' oder die Multiplikation kann "first" oder gleichzeitig gehen. Das Ergebnis von "a -" ist das Anfangs-'a' für die nachfolgende Berechnung. – chux
@chux Ich nehme an, aber es würde nicht die aktuelle Aussage oder den verwendeten Wert, richtig? –
Einverstanden - in diesem Fall. noch im Fall von a- + (a) * (- 2), macht die Zweideutigkeit von _first_ 'a -' oder '(a) * (- 2)' dieses Beispiel undefiniert. – chux
Um zu verstehen, Ihre Verwirrung besser wäre es interessant, wenn man uns gesagt, was Sie dachten, sollte das Ergebnis sein (Schritt für Schritt durch die Berechnung gehen). – fvu
'3 + (-3 * -2) == 3 + 6 == 9'? Das Dekrement ändert "a" nach "2", nachdem der alte Wert verwendet wurde. –
@ JonathanLeffler genau ausgerichtet. Also, wenn ich --a hätte wäre das Ergebnis 8? –