2008-09-29 22 views

Respuesta

37

Cuando un Bool verdad se convierte en un int, siempre es convertida a 1. Su código es, por tanto, equivalente a:

main(){ 
    int a = 10; 
    if (1 == a) 
     cout<<"y i am not getting executed"; 
    } 

Esto es parte de la C++ standard, así que es algo que se puede esperar que suceda con cada compilador compatible con los estándares de C++.

+0

Creo que quiere decir "siempre se convierte a 1" en lugar de "siempre se convierte en verdadero" –

+1

¿Quizás una explicación rápida de por qué es el bool convertido a int, no el int convertido a bool? Quiero decir, "porque el estándar C++ lo dice" cubre la mayor parte, pero aún así ... –

+0

El valor de "verdadero" cuando se convierte a int es específico del compilador, ¿o es parte del estándar? –

2

Porque verdadero es 1. Si desea probar un valor distinto de cero, simplemente escriba if (a).

+2

Eek. Si desea probar un valor distinto de cero, escriba if (a! = 0). 3 caracteres adicionales para decir lo que realmente estás pensando, en lugar de decir algo que el lenguaje hace equivalente a lo que estás pensando. Negociar. –

+0

Son 5 caracteres adicionales, porque agregaría espacios entre el operador y sus operandos;) – OregonGhost

+0

Oh, bueno, en ese caso tomé punto;) Solía ​​usar si (a) mucho para punteros, es decir, tipo de "si hay es una a ". Pero finalmente decidí que para mí no estaba realmente ayudando, y lo dejé. –

5

Su booleano es promovido a un entero, y se convierte en 1.

-1

yo no esperaría que el código a ser definida y que no debe depender de lo que el comportamiento de su compilador te da. Probablemente, el verdadero se está convirtiendo en un int (1), y a no se está convirtiendo en un bool (verdadero) como se espera. Es mejor escribir lo que quiere decir (a! = 0) y luego depender de esto (incluso si resulta ser definido).

-1

algo diferente de 0 (que es falso) no es necesario cierto (es decir 1)

-2

Debido a un valor booleano es un poco en C/C++ y verdadero está representado por 1, falsa por 0.

Actualización: como dije en el comentario, mi respuesta original es falsa. Así que omitirlo.

+0

C/C++ no prescribir booleano para ser un poco. En C++, el tamaño de bool depende de la implementación. C no tiene tipo de bool, es un número entero. –

+0

C99 tiene un tipo de bool, habilitado por #include . Pero estoy de acuerdo en que el tipo bool no es ni un poco en C ni en C++. –

-2

Porque verdadero es igual a 1. Se define en una directiva de preprocesador, por lo que todo el código con verdadero en él se convierte en 1 antes del tiempo de compilación.

+0

¡Tha está simplemente equivocado! true y false son símbolos definidos en el lenguaje y no tienen nada que ver con el preprocesador (¡a diferencia del antiguo C con TRUE y falso)! – PierreBdR

26

El motivo por el que su instrucción de impresión no se está ejecutando es porque su booleano se convierte implícitamente en un número en lugar de al revés. Es decir. su sentencia if es equivalente a esto: si (1 == a)

Se puede evitar esto mediante la primera convertirlo explícitamente a un valor lógico:

main(){ 
int a = 10; 
if (((bool)a) == true) 
    cout<<"I am definitely getting executed"; 
} 

En C/C++ falsa se representa como 0.

Todo lo demás se representa como distinto de cero. Eso es a veces 1, a veces cualquier otra cosa. Por lo tanto, nunca debe probar la igualdad (==) a algo que sea cierto.

En su lugar, debe probar la igualdad de algo que es falso. Dado que falso tiene solo 1 valor válido.

Aquí estamos probando para todos los valores no falsas, ninguno de ellos está muy bien:

main(){ 
int a = 10; 
if (a) 
    cout<<"I am definitely getting executed"; 
} 

Y un tercer ejemplo sólo para demostrar que es seguro para comparar cualquier número entero que se considera falsa a un falso (que sólo es 0):

main(){ 
int a = 0; 
if (0 == false) 
    cout<<"I am definitely getting executed"; 
} 
+0

usa conversión de estilo de función o un molde de C++. Los estuches de estilo C son malvados. 'bool (a)' o 'static_cast (a)'. – Aaron

+0

Aaron, lo siento es una tontería :) "fundición de estilo de función" es semánticamente equivalente a un elenco de estilo (T) x, e introduce ambigüedades, además. En todo caso, es una cuestión de gusto, pero T (x) podría tener más problemas que (T) x. –

3

en C y C++, 0 es falsa y nada más que cero es verdadera:

if (0) 
{ 
// never run 
} 

if (1) 
{ 
// always run 
} 

if (var1 == 1) 
{ 
// run when var1 is "1" 
} 

Cuando el compilador calcula una expresión booleana, está obligado a producir 0 o 1.Además, hay un par de definiciones de tipos y definiciones, que te permiten usar "verdadero" y "falso" en lugar de 1 y 0 en tus expresiones.

Así que su código en realidad se parece a esto:

main(){ 
int a = 10; 
if (1 == a) 
    cout<<"y i am not getting executed"; 
} 

es probable que desee:

main(){ 
int a = 10; 
if (true == (bool)a) 
    cout<<"if you want to explicitly use true/false"; 
} 

o en realidad sólo:

main(){ 
int a = 10; 
if (a) 
    cout<<"usual C++ style"; 
} 
1

sugiero que cambie a un compilador que advierte sobre esto ... (VC++ produce esto: advertencia C4806: '==': operación insegura: ningún valor de tipo 'bool' promovido a tipo 'int' puede igualar la constante dada; No tengo otro compilador a mano.)

Estoy de acuerdo con Lou Franco: si desea saber si una variable es mayor que cero (o no igual), pruébelo.

Todo lo hecho implícitamente por el compilador es peligroso si no conoce el último detalle.

0

Aquí es la forma más gente escribe ese tipo de código:

main(){ 
int a = 10; 
if (a) // all non-zero satisfy 'truth' 
    cout<<"y i am not getting executed"; 
} 

También he visto:

main(){ 
int a = 10; 
if (!!a == true) // ! result is guaranteed to be == true or == false 
    cout<<"y i am not getting executed"; 
} 
Cuestiones relacionadas