2012-07-23 19 views
5

Bedingung Ausdruck wie diejenigen, die & & und ||, bewerten sie immer 0 oder 1? Oder für eine echte Bedingung, andere Zahlen als 1 sind möglich? Ich frage, weil ich eine Variable wie diese zuweisen möchte.Werden Bedingungsausdrücke immer zu 0 oder 1 in C ausgewertet?

int a = cond1 && cond2; 

Ich fragte mich, ob ich stattdessen Folgendes tun sollte.

int a = (cond1 && cond2)? 1:0; 
+0

eigentlich, was ist Ihre Hauptanforderung? Warum werden Sie diese Variable zuweisen? –

Antwort

14

Die logischen Operatoren (&&, || und !) alle bewerten entweder zu 1 oder 0.

C99 §6.5.13/3:

&& Der Betreiber hat 1 ergeben, wenn beide Operanden zu 0 ungleicher vergleichen; andernfalls ergibt es 0. Das Ergebnis hat den Typ int.

C99 §6.5.14/3:

|| Der Betreiber hat 1 ergeben, wenn einer seiner Operanden zu 0 ungleichen vergleichen; andernfalls ergibt es 0. Das Ergebnis hat den Typ int.

C99 6.5.3.3/5:

Das Ergebnis des logischen Negationsoperators !0 ist, wenn der Wert des Operanden ungleich vergleicht 0, 1, wenn der Wert des Operanden gleich vergleicht 0. Das Ergebnis hat den Typ int. Der Ausdruck! E ist äquivalent zu (0 == E).

+0

(Ich habe keine Kopie von C11 praktisch, aber ich bin sicher, dass die Spezifikation der logischen Operatoren nicht geändert hat.) –

0
'&&' 
    The logical-AND operator produces the value 1 if both operands have nonzero 
    values. If either operand is equal to 0, the result is 0. If the first operand of a 
    logical-AND operation is equal to 0, the second operand is not evaluated. 

'||' 
     The logical-OR operator performs an inclusive-OR operation on its operands. 
    The result is 0 if both operands have 0 values. If either operand has a nonzero 
    value, the result is 1. If the first operand of a logical-OR operation has a nonzero 
    value, the second operand is not evaluated. 

Die Operanden von logischem AND und logisch-ODER-Ausdrücke ausgewertet werden, von links nach rechts. Wenn der Wert des ersten Operanden ausreicht, um das Ergebnis der Operation zu ermitteln, wird der zweite Operand nicht ausgewertet. Dies wird als "Kurzschlussauswertung" bezeichnet. Es gibt einen Sequenzpunkt nach dem ersten Operanden.

Danke, :)

+2

Und das beantwortet die Frage nicht. –