Die Anweisung (4 > y > 1)
wird folgendermaßen analysiert:
Die Vergleichsoperatoren <
und >
bewerten von links nach rechts .
Das 4 > y
gibt entweder 0
oder 1
zurück, je nachdem, ob es wahr ist oder nicht.
Dann wird das Ergebnis mit 1 verglichen.
In diesem Fall, da 0
oder 1
niemals mehr als 1
ist, gibt die ganze Anweisung immer false zurück.
Es gibt jedoch eine Ausnahme:
Wenn y
eine Klasse ist und der Operator >
überladen wurde, um etwas Ungewöhnliches zu tun. Dann geht alles.
Dies kann zum Beispiel nicht kompiliert werden:
%Vor%Ausdrucksgültigkeit
Ja, es ist ein gültiger Ausdruck, unter der Annahme, dass y eine ganze Zahl ist oder implizit in eine ganze Zahl umgewandelt werden kann. Wenn dies nicht der Fall ist und der >
-Operator überladen ist, ist das eine andere Geschichte, die über den Rahmen dieser Frage hinausgeht.
Es wird von links nach rechts als ((4 > y) > 1)
ausgewertet.
Wenn y
eine Ganzzahl ist, betrachten wir die beiden Möglichkeiten. 4 > y
kann true
oder false
zurückgeben. Der nächste Teil wird effektiv true > 1
oder false > 1
.
Bei der impliziten bool-int-Konvertierung gibt es zwei Möglichkeiten:
A) 4 > y
gibt true
zurück. true
ergibt 1
. 1 > 1
wird zu false ausgewertet.
B) 4 > y
gibt false
zurück. false
ergibt 0
. 0 > 1
wird zu false ausgewertet.
Egal was, der Ausdruck wird zu falsch ausgewertet.
Umgeschriebene Interpretation
Ich nehme an, was Sie beabsichtigen ist ((4 > y) && (y > 1))
.
Beispiel
(4 > y > 1)
ist nicht dasselbe wie (4 > y && y > 1)
.
Logische Operatoren
Die logischen Operatoren ( !
, &&
, ||
) verwenden eine Kurzschlusslogik.
Gegeben a && b
, a
wird ausgewertet. Wenn a
als wahr ausgewertet wird, wird b
ausgewertet. Sonst wird b
nicht ausgewertet . Wie bei a || b
arbeitet die Kurzschlusslogik umgekehrt. a
wird ausgewertet. Da der Ausdruck a
zuerst ausgewertet wird, ist es bei false nicht möglich, dass der gesamte Ausdruck als wahr ausgewertet wird.
Gegeben a || b
, a
wird ausgewertet. Wenn a
zu false ausgewertet wird, wird b
ausgewertet. Sonst wird b
nicht ausgewertet . Da der Ausdruck a
zuerst ausgewertet wird, gibt es keine Möglichkeit, dass der gesamte Ausdruck falsch ausgewertet wird.
Die Verkettung der Operatoren hängt von der Operatorenpräzedenz ab. Besser, Klammern zu verwenden und klar zu sein, anstatt das falsche Verhalten zu riskieren.
Ich denke, es ist ein gültiger Ausdruck (keine Aussage), aber wahrscheinlich nicht, was Sie wollen. Es wird von links nach rechts als (4 > y) > 1
ausgewertet. Der Test 4 > y
wird entweder zu 0 (falsch) oder 1 (wahr) ausgewertet, und der gesamte Ausdruck wird immer zu 0 (falsch) ausgewertet.
4 & gt; y wird zu einem booleschen Wert von wahr oder falsch ausgewertet. Der Rest des Ausdrucks ist dann im Wesentlichen [wahr | falsch] & gt; 1, was keinen Sinn ergibt.
4 & gt; y & gt; 1 - & gt; MÖGLICH sein, wenn y - ist Klasse !!.
%Vor%Tags und Links c++ conditional if-statement boolean-logic logical-operators