2015-12-25 7 views
6

Ich habe ein Problem mit einer Frage in meinem Buch:Grundlegende Programmierübung über logische Operatoren

#include<stdio.h> 
void main() 
{ 
    int a=5, b=-7, c=0, d; 
    d = ++a && ++b || ++c; 
    printf("\n%d%d%d%d",a,b,c,d); 
} 

Die Frage fragt mich, was die Ausgabe des Codes ist. Ich habe es ausgeführt und das Ergebnis auf dem Bildschirm ist 6-601. Ich verstehe, warum a=6 und b=-6, aber ich verstehe nicht, warum c=0 und d=1?

+0

Ihre Antwort wurde angenommen. Das ist so viel Beweis, wie Sie brauchen würden. Ich frage mich manchmal, ob ich es nicht übertreibe, wenn ich eine solche Antwort schreibe, und wenn ich fertig bin, hat jemand eine "Versuchen Sie diese" Antwort geschrieben, die stattdessen akzeptiert wird. – GolezTrol

+0

@GolezTrol Ich denke, Sir, dass Sie diesen Kommentar unter meiner Antwort posten wollten, aber danke. :) –

+0

@SouravGhosh Ah, das ist, wo dieser Kommentar ging! Ich wollte es unter [deine Frage auf Meta] stellen (http://meta.stackoverflow.com/questions/313420/how-much-explanation-is-good-am-i-overdoing-it), aber dann konnte ich nicht Ich finde es nicht mehr. :) – GolezTrol

Antwort

15

Ich glaube, Sie haben bereits Ihre Antwort, aber nur ein wenig Schritt für Schritt, lassen Sie mich noch eine Klarstellung hier hinzufügen. Zum einen die Eigenschaften der &&|| und Operatoren zu zitieren, von C11 Standard, Kapitel §6.5.13 und §6.5.13 bzw.

(I)

&& Der Betreiber hat 1 ergeben, wenn beide Operanden vergleichen ungleich 0; ansonsten ergibt 0. [...] Wenn der erste Operand gleich 0 vergleicht, wird der zweite Operand nicht ausgewertet.

und

(II)

|| Der Betreiber hat 1 ergeben, wenn einer seiner Operanden ungleich 0 zu vergleichen; sonst ergibt es ergibt 0. [...]. Wenn der erste Operand ungleich 0 vergleicht, wird der zweite Operand nicht ausgewertet.

und beide garantieren von links nach rechts Bewertung.Also, Ihr Code zu vergleichen,

d = ++a && ++b || ++c; 

es geschieht wie

d = ((++a && ++b) || ++c); 

die

d = ((6 && ++b) || ++c); 

zu

auswertet und dann

d = ((6 && (-6)) || ++c); 

Jetzt in oben Stufe (I) ist erfüllt und es kommt auf

d = (1 || ++c); 

Jetzt, nach der Betonung, die bereits die (II) erfüllt, so dass keine weitere Auswertung der RHS-Operanden von || durchgeführt wird (dh ++c wird nicht ausgewertet), und es scheint, d = 1 und zu sein Endergebnis, 1, wird in d gespeichert.

Das ist wie, a == 6, b == -6, c == 0 und d ==1.


Having said that, sollte void main() zu int main(void), zumindest mit dem Standard entsprechen geändert werden.

+0

Danke, deine Erklärung ist sehr klar, aber ich bin verwirrt zwischen void main() und int main (void), der Code über ich habe gerade direkt aus meinem Buch kopiert. –

+0

@ Hoang.T gibt es eine sehr gute Diskussion [hier] (http://stackoverflow.com/q/204476/2173917). Lies es. :) –

14

Der OR-Operator || ist kurzgeschlossen, dh wenn die linke Seite wahr ist, dann wird die rechte Seite nicht ausgewertet. In diesem Fall wird ++a && ++b als wahr ausgewertet, so dass ++c niemals ausgeführt wird und c seinen Wert von Null beibehält.

Auch, da es wahr bewertet, wird dies mit 1 bezeichnet, die in d gespeichert ist.

Jeder Wert ungleich Null wird als wahr betrachtet, und das Ergebnis boolescher Operationen wird als 0 oder 1 als ganze Zahl definiert.

Verwandte Themen