Ich habe an einige Anfängerfehler gedacht und bin zu dem auf der if
Aussage gekommen. Ich habe den Code ein bisschen erweitert:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
Ich habe gesehen , dass die if
Anweisung gibt wahr, und es cout
ist i
so 1
. Wenn in der if-Anweisung i
zugewiesen 1
, warum wurde i == 0
zurückgegeben true
?
c++
if-statement
TehMattGR
quelle
quelle
i
ist1
.1 && i == 0
?Antworten:
Dies hat mit der Priorität des Operators zu tun .
ist nicht
weil beide
&&
und==
eine höhere Priorität haben als=
. Was es wirklich klappt istdie ordnet das Ergebnis
1 && (i == 0)
zui
. Also, wenni
beginnt bei0
danni == 0
isttrue
, so1 && true
isttrue
(oder1
), und danni
auf wird eingestellt1
. Da dies1
wahr ist, geben Sie den if-Block ein und drucken den Wert, den Sie zugewiesen habeni
.quelle
i = !i; if (i)
richtig geschriebenAngenommen, Ihr Code sieht tatsächlich so aus:
Dann das:
bewertet als
und so
i
ist eingestellt auf1
.quelle
using namespace std
!=
vorher gekommen&&
ist, das Problem sehen kann. Auch ja, die Erweiterung ist irrelevant, aber ich denke nicht, dass es so wichtig ist. Ich kann nicht glauben, dass solche kleinen Unterschiede dazu führen, dass die Leute zwischen 151 und -4 stimmen.Es hat mit dem Parsen der Regeln von rechts nach links zu tun. ZB y = x + 5.
Alle Unterausdrücke werden nach Wichtigkeit gewichtet. Zwei gleich wichtige Ausdrücke werden von rechts nach links ausgewertet. Die && Ausdrucksseite wird zuerst ausgeführt, gefolgt von der LHS.
Für mich ergibt das Sinn.
quelle
Die eigentliche Antwort lautet:
Schauen Sie sich zum Beweis einfach die asm-Ausgabe Ihres Compilers für den von Ihnen eingegebenen Code an (alle Kommentare sind meine eigenen):
Die obige ASM-Ausgabe stammte von CLANG, aber alle anderen Compiler, die ich mir ansah, gaben eine ähnliche Ausgabe. Dies gilt für alle Compiler auf dieser Site, unabhängig davon, ob es sich um reine C- oder C ++ - Compiler handelt. Alle haben keine Pragmas, um den Modus des Compilers zu ändern (der für die C ++ - Compiler standardmäßig C ++ ist).
Beachten Sie, dass Ihr Compiler nicht i = 1 gesetzt hat, sondern i = TRUE (was bedeutet, dass jeder 32-Bit-Ganzzahlwert nicht Null ist). Dies liegt daran, dass der Operator && nur auswertet, ob eine Anweisung TRUE oder FALSE ist, und dann die Ergebnisse entsprechend diesem Ergebnis festlegt. Versuchen Sie als Beweis, i = 1 in i = 2 zu ändern, und Sie können selbst beobachten, dass sich nichts ändern wird. Überzeugen Sie sich selbst von einem beliebigen Online-Compiler im Compiler Explorer
quelle
i = 1
ist ein Zuweisungsoperator [keine Äquivalenz]; 2b) Ich kann Ihnen versichern, dassif (i = 0)
sowohl in C als auch in C ++ ein falscher Zustand vorliegt. Es ist also etwas irreführend, ob es als wahr bewertet wird, "es scheitert nie".and cl, 1 ; = operator always TRUE
<< korrigiere mich, wenn ich falsch liege, aber ich sehe hier keine Zuordnung. Es repräsentiert den1 &&
Teil des Ausdrucks. Diese Antwort ergibt sich also grundsätzlich zufalse
.if ( i = 0 ) { print something }
. Auch Ihre Antwort widerspricht sich; Am Anfang sagen Sie, dassi=1
das ausgewertet wird, bevor&&
es angewendet wird, und am Ende sagen Sie, dassi
es auf das Ergebnis des&&
Operators gesetzt ist.