Posso assumir (bool) true == (int) 1 para qualquer compilador C ++?

Posso assumir (bool)true == (int)1 para qualquer compilador C ++?

Sim. Os castings são redundantes. Em sua expressão:

 true == 1 

A promoção integral é aplicada e o valor do bool será promovido para um int e essa promoção deve render 1.

Referência: 4.7 [conv.integral] / 4: Se o tipo de fonte for booltrue será convertido para um.

A resposta de Charles Bailey está correta. O texto exato do padrão C ++ é (§4.7 / 4): “Se o tipo de fonte é bool, o valor false é convertido em zero e o valor true é convertido em um.”

Edit: Eu vejo que ele adicionou a referência também – eu vou apagar isso em breve, se eu não me distrair e esquecer …

Edit2: Então, novamente, provavelmente vale a pena notar que enquanto os próprios valores booleanos sempre convertem para zero ou um, um número de funções (especialmente da biblioteca padrão C) retorna valores que são “basicamente Booleanos”, mas representados como int s normalmente só precisam ser zero para indicar falso ou diferente de zero para indicar verdadeiro. Por exemplo, as funções is * em requerem apenas zero ou diferente de zero, não necessariamente zero ou um.

Se você converter isso para bool , zero será convertido para falso e diferente de zero para verdadeiro (como seria de se esperar).

De acordo com o padrão, você deve estar seguro com essa suposição. O tipo de bool C ++ possui dois valores – true e false com os valores correspondentes 1 e 0.

A coisa a se observar é misturar expressões e variables bool expressões e variables BOOL . Este último é definido como FALSE = 0 e TRUE != FALSE , o que muitas vezes, na prática, significa que qualquer valor diferente de 0 é considerado TRUE .

Muitos compiladores modernos emitirão um aviso para qualquer código que implicitamente tente converter de BOOL para bool se o valor BOOL for diferente de 0 ou 1.

Eu encontrei diferentes compiladores retornando resultados diferentes em true. Eu também descobri que é quase sempre melhor comparar um bool a um bool em vez de um int. Esses ints tendem a mudar o valor ao longo do tempo à medida que seu programa evolui e, se você considerar verdadeiro como 1, você pode ser mordido por uma alteração não relacionada em outro lugar em seu código.

Não, TRUE pode ser arbitrário entre compiladores. Alguns usarão 1, alguns -1 (todos os bits definidos, assinados var), outros compiladores podem usar um valor diferente. Mesmo se o valor for padronizado, nem todos os compiladores podem seguir o padrão.

FALSE, no entanto, é quando todos os bits são claros, o que acontece apenas para o valor numérico 0.