O tipo de bool C / C ++ é sempre garantido como 0 ou 1 quando é convertido para int?

Muitos compiladores parecem manter apenas 0 ou 1 em valores booleanos, mas não tenho certeza se isso sempre funcionará:

int a = 2; bool b = a; int c = 3 + b; // 4 or 5? 

Sim:

Em C ++ (§4.5 / 4):

Um rvalue do tipo bool pode ser convertido em um rvalue do tipo int, com false se tornando zero e true se tornando um.

Em C, quando um valor é convertido em _Bool , ele se torna 0 ou 1 (§6.3.1.2 / 1):

Quando qualquer valor escalar é convertido em _Bool, o resultado é 0 se o valor for igual a 0; Caso contrário, o resultado é 1.

Ao converter para int , é bem direto. int pode conter 0 e 1, portanto não há mudança no valor (§6.3.1.3).

É C / C ++ …….

Não há linguagem chamada C / C ++.

Tipo de bool sempre garantido para ser 0 ou 1 quando typecast’ed para int?

Em C ++ sim porque a seção $ 4.5 / 4 diz

Um rvalue do tipo bool pode ser convertido em um rvalue do tipo int, com false se tornando zero e true se tornando um.

.

int c = 3 + b; // 4 ou 5?

O valor de c será 4

Bem, nem sempre

 const int n = 100; bool b[n]; for (int i = 0; i < n; ++i) { int x = b[i]; if (x & ~1) { std::cout << x << ' '; } } 

Saída no meu sistema:

 28 255 34 148 92 192 119 46 165 192 119 232 26 195 119 44 255 34 96 157 192 119 8 47 78 192 119 41 78 192 119 8 250 64 2 194 205 146 124 192 73 64 4 255 34 56 2 55 34 224 255 34 148 92 192 119 80 40 190 119 255 255 255 255 41 78 192 119 66 7 8 192 119 192 73 64 240 255 34 25 74 64 192 73 64 

A razão para esta saída aparentemente estranha é apresentada na norma, 3.9.1 §6:

Valores do tipo bool são true ou false . Usar um valor de bool maneiras descritas por esta Norma como "indefinida", como examinar o valor de um object automático não inicializado, pode fazer com que ele se comporte como se não fosse true nem false .

Mais um exemplo quando você está fora do barco seguro:

  bool b = false; *(reinterpret_cast(&b)) = 0xFF; int from_bool = b; cout << from_bool << " is " << (b ? "true" : "false"); 

Saída (g ++ (GCC) 4.4.7):

  255 is true 

Para ser adicionado ao exemplo do FredOverflow .

Não há nenhum tipo de bool em C pre C99 (como C90), no entanto, o tipo de bool em C99 / C ++ é sempre garantido como 0 ou 1.

Em C, todas as operações booleanas têm a garantia de retornar 0 ou 1, quer o tipo de bool esteja definido ou não.

Então, a && b ou !a ou a || b a || b sempre retornará 0 ou 1 em C ou C ++, independentemente do tipo de a e b .