Ist (4 y 1) eine gültige Anweisung in C ++? Wie bewerten Sie es, wenn ja?

8

Ist das ein gültiger Ausdruck? Wenn ja, können Sie es so umschreiben, dass es mehr Sinn macht? Zum Beispiel, ist es das gleiche wie (4 > y && y > 1) ? Wie bewerten Sie verkettete logische Operatoren?

    
trusktr 17.01.2012, 04:08
quelle

5 Antworten

18

Die Anweisung (4 > y > 1) wird folgendermaßen analysiert:

%Vor%

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%     
Mysticial 17.01.2012, 04:11
quelle
4

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.

    
Sion Sheevok 17.01.2012 04:31
quelle
4

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.

    
Ted Hopp 17.01.2012 04:11
quelle
2

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.

    
user321605 17.01.2012 04:11
quelle
-1

4 & gt; y & gt; 1 - & gt; MÖGLICH sein, wenn y - ist Klasse !!.

%Vor%     
Khurshid Normuradov 25.01.2018 08:24
quelle