Ja, das Konzept Short-Circuit genannt (in logische &&
, ||
Operatoren Ausdruck).
Bei jedem logischen Ausdruck (einschließlich ||
, &&
) beendet der Compiler den Auswertungsausdruck, sobald das Ergebnis ausgewertet wurde (und speichert die Ausführungen).
Die Technik für Kurzschluss:
!0 || any_expression
== 1
, so any_expression
nicht auswerten müssen.
Und weil in Ihrem Ausdruck i
ist nicht Null, sondern seine 10, so können Sie denken, wenn consition (i || (j = i + 10))
genauso wie i
.
Logical OR-Operator:
Die ||
Betreiber garantiert, von links nach rechts Bewertung; Nach der Auswertung des ersten Operanden gibt es einen Sequenzpunkt. Wenn der erste Operand unequal
mit 0
vergleicht, wird der zweite Operand not
ausgewertet.
Ebenso für & & (und Betreiber):
0 && any_expression
== 0
, so any_expression
nicht auswerten müssen.
In Ihrem Ausdruck:
(i || (j = i + 10))
------------
^
| Could evaluate if i is 0,
as i = 10 (!0 = true), so j remains unchanged as second operand is not evaluated
Für oder ||
Antwort Operator kann entweder 0 sein, 1. Ausführung zu speichern, Auswertung wird beendet, sobald Ergebnisse finden. Wenn also der erste Operand nicht Null ist, wird das Ergebnis 1
(wie oben) für den Ausdruck sein. Also für den ersten Operanden i = 10
vergleicht ungleich 0, der zweite Operand (j = i + 10)
wird nicht ausgewertet, so j
bleibt 0
daher Ausgabe Ihres Codes ist 0
.
Hinweis: Kurzschlussverhalten ist nicht nur in C vorhanden, sondern ist in vielen Sprachen wie Java, C++, Python üblich. (aber nicht alle beispielsweise VB6).
In C ist das Kurzschließen von logischen Ausdrücken garantiert immer ein Merkmal von C. Es war wahr, als Dennis Ritchie die erste Version von C entwarf und implementierte, die immer noch in der C-Norm von 1989 wahr ist C99 Standard.
Ein verwandtes Beitrag: Is short-circuiting boolean operators mandated in C/C++? And evaluation order?
Kurzgeschlossener boolescher Ausdruck. – jxh
Das mag wie eine dumme Frage erscheinen, aber ich lerne - wie könnte das Programm jemals 20 ausgeben? Hat es etwas speziell mit C zu tun? – Andy
@Andy ** (1) ** - Programm könnte "20" ausgeben, nur wenn "i = 0" (das gibt die Änderung, um Ausdruck "j = i + 10" auszuführen). ** (2) ** Nein, dieser Code ist in C++ gültig, sogar in Java, weil wir '' '' in 'if()' tun können und beide einen Kurzschluss unterstützen. --- Es wäre interessant zu wissen, auch [Python unterstützt Kurzschluss] (http://stackoverflow.com/questions/2580136/does-python-support-short-circuiting/14892812#14892812) aber dieser Ausdruck 'if (i || (j = i + 10)) 'ist in Python nicht gültig, weil' = 'in' if' ein Syntaxfehler ist. –