it-swarm.com.de

Kann ich (bool) true == (int) 1 für jeden C ++ - Compiler annehmen?

Kann ich annehmen, (bool)true == (int)1 für einen C++ - Compiler?

109
Petruza

Ja. Die Abgüsse sind überflüssig. In deinem Ausdruck:

true == 1

Integrale Promotion wird angewendet und der Bool-Wert wird zu einem int befördert. Diese Promotion muss 1 ergeben.

Referenz: 4.7 [conv.integral]/4: Wenn der Quelltyp bool... true ist, wird er in eins konvertiert.

128
CB Bailey

Charles Baileys Antwort ist richtig. Der genaue Wortlaut des C++ - Standards lautet (§4.7/4): "Wenn der Quellentyp bool ist, wird der Wert false in null und der Wert true in eins konvertiert."

Bearbeiten: Ich sehe, dass er die Referenz auch hinzugefügt hat - ich werde dies in Kürze löschen, wenn ich nicht abgelenkt werde und vergesse ...

Edit2: Andererseits ist es wahrscheinlich erwähnenswert, dass, während die Booleschen Werte selbst immer in Null oder Eins konvertieren, eine Reihe von Funktionen (insbesondere aus der C-Standardbibliothek) Werte zurückgeben, die "grundsätzlich Boolesch" sind, aber als ints, die normalerweise nur null sein müssen, um falsch anzuzeigen, oder ungleich null, um wahr anzuzeigen. Zum Beispiel funktioniert das is * in <ctype.h> erfordern nur null oder nicht null, nicht unbedingt null oder eins.

Wenn Sie dies in bool umwandeln, wird Null in Falsch und Nicht-Null in Wahr umgewandelt (wie erwartet).

18
Jerry Coffin

Nach dem Standard sollten Sie mit dieser Annahme sicher sein. Der Typ C++ bool hat zwei Werte - true und false mit den entsprechenden Werten 1 und 0.

Achten Sie auf das Mischen von bool Ausdrücken und Variablen mit BOOL Ausdrücken und Variablen. Letzteres ist definiert als FALSE = 0 und TRUE != FALSE, was in der Praxis häufig bedeutet, dass jeder von 0 abweichende Wert als TRUE betrachtet wird.

Viele moderne Compiler geben tatsächlich eine Warnung für jeden Code aus, der implizit versucht, von BOOL nach bool umzuwandeln, wenn der Wert von BOOL nicht 0 oder 1 ist.

7
Franci Penov

Ich habe festgestellt, dass verschiedene Compiler unterschiedliche Ergebnisse auf true zurückgeben. Ich habe auch festgestellt, dass es fast immer besser ist, einen Bool mit einem Bool anstelle eines Int zu vergleichen. Diese Werte ändern sich im Laufe der Zeit, wenn sich Ihr Programm weiterentwickelt. Wenn Sie den Wert 1 annehmen, können Sie von einer nicht damit zusammenhängenden Änderung an einer anderen Stelle in Ihrem Code gebissen werden.

3
Michael Dorgan