2017-01-17 4 views
1

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; 
} 
+2

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

+4

'3 + (-3 * -2) == 3 + 6 == 9'? Das Dekrement ändert "a" nach "2", nachdem der alte Wert verwendet wurde. –

+0

@ JonathanLeffler genau ausgerichtet. Also, wenn ich --a hätte wäre das Ergebnis 8? –

Antwort

5

Der Ausdruck

rez = a-- + (-3) * (-2) 

ist als

geparst
res = ((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 
0

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.

+0

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

+0

@chux Ich nehme an, aber es würde nicht die aktuelle Aussage oder den verwendeten Wert, richtig? –

+0

Einverstanden - in diesem Fall. noch im Fall von a- + (a) * (- 2), macht die Zweideutigkeit von _first_ 'a -' oder '(a) * (- 2)' dieses Beispiel undefiniert. – chux

Verwandte Themen