2011-10-05 19 views
6

Consideremos el siguiente código C++:Sumando los valores bool en C/C++

bool a = 5; 
bool b = 6; 
int c = (int)a + (int)b; 

Cuando compilo & ejecutar este código, c tiene el valor 2. ¿Tiene la garantía estándar que, en cualquier compilador/plataforma, bool los valores inicializados con falso (0) o verdadero (no necesariamente 1) serán 1 en operaciones y el código anterior siempre dará como resultado que c sea 2?

Y en C99, incluido stdbool.h, ¿sigue siendo válido?

+1

supongo que su la respuesta está aquí: http://stackoverflow.com/questions/2725044/can-i-assume-booltrue-int1-for-any-c-compiler –

+2

IMO, si asigna algo que no sea verdadero/falso a una variable bool debe ser revisado por el código. – Max

+0

Solo tengo una palabra: ¿POR QUÉ? –

Respuesta

10

Sección 4.7 (versiones enteros) de la norma el C++ dice:

Si el tipo de fuente es bool, el valor falsa se convierte en cero y el valor cierto se convierte en uno.

La sección 4.9 ofrece la misma garantía para las conversiones de coma flotante.

+0

Gracias, esta respuesta para C++, pero ¿eso también es válido para C99 (con stdbool)? – fbafelipe

1

Para los compiladores, la regla es a menudo que falso es 0 y cualquier otra cosa será cierta. Sin embargo, tratar bool como si fuera un tipo entero generalmente se considera mala forma. El estándar, sin embargo, incluye una regla para convertir a int y su suposición es correcta false = 0 y true = 1, siempre y cuando el compilador se adhiera al estándar.

En cualquier caso, ¿por qué la aritmética con tipos bool?

Esperanza esta ayuda

+0

Arichmetic with bool types puede ser útil para escribir menos código, por lo que puede escribir x + = a ;, en lugar de x + = (a? 1: 0) ;. – fbafelipe

+0

¿Por qué no usar x | = a; o incluso x = x || un; todo agradable y respetuoso de los tipos subyacentes – Martin

+0

Y si x es un int, ¿cuántos (un conjunto de bools) son verdaderos? Sé que hay formas de evitarlo, pero como esto parece más simple, estoy haciendo la pregunta para saber si siempre funcionará. – fbafelipe

1

De acuerdo con la norma:

  • true convierte a 1
  • false convierte a 0

y arrojó a int no es necesario ya que la conversión a int está implícito.

1

David Schwartz ya respondió para C++. Para el estándar C99 tenemos 6.3.1.4:

Cuando cualquier valor escalar se convierte en _Bool, el resultado es 0 si el valor compara igual a 0; de lo contrario, el resultado es 1.

Desde 6.3.1.1 de la norma también deja claro que _Bool está sujeto a promociones enteros está claro que un _Bool siempre va a ser 0 o 1.