2016-06-04 14 views
5

if(10) ist es wahr, aber if(10 == true) ist falsch. Kann mir jemand sagen, warum der erste Fall die Zahl in bool konvertiert, aber der zweite Fall nicht?Warum kann ich nicht überprüfen, ob eine Variable einen Wert mit == true hat?

+2

Versuch 'if (!! 10 == true)' – BLUEPIXY

+2

der Wert 'true' kann alles sein (ich oft gesehen habe, 1 und 0 und 2 in verschiedenen Compilern. Aber alles, was nicht 0 ist (false) kann getestet werden und der Test wird 'true' zurückliefern.Deshalb können Sie verwenden: 'if (10)' aber nicht 'if (1 == true)' In der 'if' Anweisung, die fehlschlägt, der Wert 1 wird mit dem Wert verglichen, der verwendet wird, um "wahr" darzustellen. In jedem Fall ist 10 nicht 1 (noch 2 noch! 0), so dass das Ergebnis des Vergleichs falsch ist. – user3629249

+1

@ user3629249: In C++ ist "true" ein a Boolescher Wert, der genau in 1 umgewandelt wird, wenn er in eine ganze Zahl umgewandelt wird.Ich glaube, das ist konsistent mit c99, wenn man 'stdbool.h' einbezieht. – rici

Antwort

21

if (10) entspricht if (10 != 0), während if (10 == true)if (10 == 1) ist (da true auf den Wert gefördert wird 1 vom Typ int).

In Laien ausgedrückt: Zwei Dinge, die beide zufällig eine Eigenschaft erfüllen, sind nicht automatisch das Gleiche.

(zB Donuts und Frisbees sind beide rund, aber das bedeutet nicht, dass ein Donut ist gleich einem Frisbee. Integer und Boolean können beide in einem booleschen Kontext ausgewertet werden, aber das bedeutet nicht, dass jede ganze Zahl auswertet wie wahr ist gleich jeden wahren boolean.)

+1

Ich bin nicht sicher, ob deine Laienbegriffe wirklich Laien sind. Ich finde sie geheimnisvoll ! :) – SergeyA

+0

Was ist los mit Leuten auf Stackoverflow? 'if (10)' ist NICHT äquivalent zu 'if (10! = 0)'. Sie sind wahrscheinlich nach der Compiler-Optimierung gleichwertig. Sie können sagen, dass sie die gleichen Konsequenzen/Folgen/Nebenwirkungen haben, aber sie sind keine äquivalenten Aussagen. – lllllllllll

+0

@lllllllllll Aber es ist nicht wahr? Ist der Ausdruck in C nicht wahr, wenn er nicht Null ist? – tangrs

-2

10 ist eindeutig nicht true, in dem Sinne, dass 10 eine Zahl und true ist ein boolean.

Wenn Sie sich in einer if-Anweisung befinden, muss der Compiler die Bedingung auswerten, bis entweder true oder false erreicht wird. Wenn es kein wahr oder falsch erreicht, muss es es in ein wahr oder falsch umwandeln. Als allgemeine Regel gilt 0 als falsch und alles andere als wahr.

So ist if(-1) wahr, wie ist if(234) und so weiter.

Der Ausdruck 10 == true wird bereits als falsch ausgewertet, sodass keine weitere Konvertierung erforderlich ist. if(10) ist weder wahr noch falsch, also muss der Compiler es mithilfe unserer obigen Regel konvertieren, und es wird wahr.

+0

Falsches Denken am Anfang '1 == true' ist wahr, obwohl' 1' eine Zahl ist, eine 'int'-Konstante, und 'true' ist ein' ' Bool' Konstante. –

+0

Es ist ein bisschen komplexer als das, und auch anders in C und C++.In C++ wird der steuernde Ausdruck der 'if' -Anweisung * kontextuell in' bool' konvertiert. In C werden die steuernden Ausdrücke auf Gleichheit mit 0 –

+0

Ah und in C mit 'true' und' false' verglichen Makros, die sich auf "1" und "0" erweitern, die genau wie eine andere ganze Konstante sind. –

-1

Weil sie ganz unterschiedliche Dinge sind.

In C ist alles, was NICHT falsch ist, automatisch wahr, und C hat eine sehr strenge Definition von false.

können Sie denken an if(10) als if(10 != false)

und ebenfalls if (10 == true) als if((10 == true) != false)

1
if(...) 
{ 
    // if statement 
} 

if Anweisung in C++ auszuführen, ... einen true Wert haben sollte.

Wenn Sie if(10){//something useful}

schrieb ich denke, 10 behandelt als int aber nicht bool variabel.Die folgende Logik dann angewendet werden sollte

if(10) -> if(bool(10)) -> if(true) 

Wenn Sie if(10 == true){//something useful} schreiben, nach C++ Standard, sollte es die folgende Logik hinter der Szene

if(10 == true) -> if(10 == int(true)) -> if(10 == 1) -> if(false) 

Sie etwas schreiben kann wie

if(10 != false) 

oder

if(!!10 == true) 

auch

if((bool) 10 == true) // alternatively, if(bool (10) == true) 

In alten C (vor C99), gibt es keine false oder true, aber es gibt 0 oder Nicht-0-Werte.

In modernen C (von C99), gibt es false oder true (<stdbool.h>), aber sie sind syntaktischer Zucker für 0 und 1 sind.

if(10) // evaluates directly since 10 is non-zero value 

if(10 == true) -> if(10 == 1) -> if(0) 
+0

"Wahr ist ein syntaktischer Zucker für 1 vom Typ bool" Huh? Das ist nicht korrekt. 'true' ist nicht syntaktischer Zucker.Wenden Sie '10 == true' in' 10 == bool (1) 'geht in die falsche Richtung. – GManNickG

+0

@GManNickG, Also, was ist' wahr'? Warum sehe ich '1' wenn ich' std: : cout << true << std :: end'? – lllllllllll

+0

'true' und' false' sind Schlüsselwörter, und sie sind boolesche Literale. Sie haben den Typ 'bool' (nicht' int'). Ein Wert vom Typ 'bool 'ist definiert als entweder' true' oder 'false' Der Grund, warum Sie' 1' sehen, ist ein Verhalten von 'std :: ios_base', standardmäßig werden Booleans in' int' umgewandelt und ausgegeben ('t Rue 'wirft auf' 1', 'false' wirft auf' 0'). Sie können dieses Verhalten mit ['std :: boolalpha'] (http://en.cppreference.com/w/cpp/io/manip/boolalpha) ändern. – GManNickG

Verwandte Themen