对于任何C ++编译器,我可以假设(bool)true ==(int)1吗?

时间:2010-04-27 20:54:36

标签: c++ casting boolean

我可以为任何C ++编译器假设(bool)true == (int)1吗?

5 个答案:

答案 0 :(得分:127)

是。演员表是多余的。在你的表达中:

true == 1

积分促销适用,bool值将提升为int,此促销必须产生1。

参考:4.7 [conv.integral] / 4:如果源类型为bool ... true将转换为一个。

答案 1 :(得分:18)

Charles Bailey的回答是正确的。 C ++标准的确切措辞是(§4.7/ 4):“如果源类型是bool,则将值false转换为零,将值true转换为1。”

编辑:我看到他也添加了参考资料 - 如果我不分心并且忘记了,我会很快删除它...

Edit2:然后,值得注意的是,虽然布尔值本身总是转换为零或一,但许多函数(特别是来自C标准库)返回“基本上是布尔”的值,但表示为int通常只需要为零表示false或非零表示true。例如,<ctype.h>中的is *函数只需要零或非零,不一定是零或一。

如果将其转换为bool,则零将转换为false,非零将转换为true(正如您所期望的那样)。

答案 2 :(得分:7)

根据标准,你应该对这个假设是安全的。 C ++ bool类型有两个值 - truefalse,对应的值为1和0.

需要注意的是将bool表达式和变量与BOOL表达式和变量混合在一起。后者定义为FALSE = 0TRUE != FALSE,这在实践中通常意味着任何不同于0的值都被视为TRUE

如果BOOL值不等于0或1,许多现代编译器实际上会对任何隐式尝试从bool转换为BOOL的代码发出警告。

答案 3 :(得分:4)

我发现不同的编译器会返回不同的结果。我还发现,将bool与bool而不是int进行比较几乎总是更好。随着程序的发展,这些整数往往会随着时间的推移而改变价值,如果你假设为1,你可能会被代码中其他地方的无关变化所困扰。

答案 4 :(得分:-9)

不,TRUE在编译器中可以是任意的。有些将使用1,有些-1(所有位设置,有符号var),其他编译器可能使用不同的值。即使价值标准化,并非所有编制者都遵循该标准。

然而,

FALSE是所有位都清零的情况,只有数值0才会发生。