2012-05-23 21 views
5

Wenn der Vorrang des & & ist größer als die von || sollte nicht dieser Code auswerten --b & & C++ zuerst, und somit sollte die Ausgabe sein 1 2 4 11. Aber hier ist es scheint kurzgeschlossen zu sein, um 1 2 5 10 zu geben. Bitte helfen!Reihenfolge der Auswertung von || und && in c

int x; 
int a=1,b=5,c=10; 
x=a++||--b&&++c; 
printf("%d %d %d %d\n",x,a,b,c); 
return 0; 

Antwort

14

sollte nicht dieser Code auswerten --b & & ++ c erster

Keine Operator Vorrang nicht Auswerteauftrag nicht beeinträchtigt. Es bedeutet nur, dass

a++||--b&&++c 

zu

a++||(--b&&++c) 

Equilvalent ist, so ist es immer noch a++, die zuerst ausgewertet wird und damit Kurzschlüsse in der Erklärung.

+0

Woher wissen wir, wann die Klammern gesetzt werden müssen und wann nicht? – Ashwyn

+2

@Ashwyn eine gute Regel von Thum ist, Klammern überall dort zu setzen, wo die Absicht nicht klar ist. In diesem Fall ist es keine Frage von Klammern, IMO, es ist ziemlich klar, was passiert. –

+0

@Ashwyn Ich denke, du verpasst den Punkt. Sie haben Recht damit, dass && enger ist als ||.Aber der Ausdruck bewertet immer noch von links nach rechts. –

2

Der Vorrang von && ist höher, was bedeutet, dass es enger an die Dinge links und rechts davon bindet als ||. So dass die Expression zu

a++ || (--b && ++c) 

|| entspricht wertet nur die Sache auf der rechten Seite, wenn der Ausdruck auf der linken Seite nicht-0 auswertet. Da a 1 ist, wird nur a++ ausgewertet und b wird nicht dekrementiert und c wird nicht inkrementiert.

2

Ja, hat && höhere Priorität, aber das bestimmt nur die der Operanden Gruppierung, nicht die um der Bewertung. Die Basisoperation ist hier ||, die garantiert, dass ihre rechte Seite nicht ausgewertet wird, wenn die linke wahr ist, unabhängig davon, welche Operationen auf der rechten Seite sind.

1

Es gibt zwei Konzepte bei der Arbeit hier

  1. Operatorassoziativität
  2. Compiler-Optimierung Kurzschließ

In C || Operator bleibt assoziativ. Als Ergebnis wird a ++ zuerst ausgewertet. Da die linke Seite ist wahr, Compiler-Optimierung Kurzschluss wird sicherstellen, dass die rechte Seite der || wird nicht ausgewertet, da das Ergebnis des Ausdrucks nicht geändert wird.

+0

Es hat nichts mit Optimierungen oder Compilern zu tun. Kurzschluss ist ein definiertes Standardverhalten. –

+0

Sie sind in dem Sinne richtig, dass Compileroptimierungen optional sind, während Kurzschlüsse nicht optional sind. Aber intuitiv ist das eine Optimierung. Ich werde die Antwort bearbeiten. Vielen Dank. –

+0

Viel klarer! ... –

Verwandte Themen