我可以为任何C ++编译器假设(bool)true == (int)1
吗?
答案 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
类型有两个值 - true
和false
,对应的值为1和0.
需要注意的是将bool
表达式和变量与BOOL
表达式和变量混合在一起。后者定义为FALSE = 0
和TRUE != FALSE
,这在实践中通常意味着任何不同于0的值都被视为TRUE
。
如果BOOL
值不等于0或1,许多现代编译器实际上会对任何隐式尝试从bool
转换为BOOL
的代码发出警告。
答案 3 :(得分:4)
我发现不同的编译器会返回不同的结果。我还发现,将bool与bool而不是int进行比较几乎总是更好。随着程序的发展,这些整数往往会随着时间的推移而改变价值,如果你假设为1,你可能会被代码中其他地方的无关变化所困扰。
答案 4 :(得分:-9)
不,TRUE在编译器中可以是任意的。有些将使用1,有些-1(所有位设置,有符号var),其他编译器可能使用不同的值。即使价值标准化,并非所有编制者都遵循该标准。
然而,FALSE是所有位都清零的情况,只有数值0才会发生。