我可以假设在任何C++编译器上都成立(bool)true == (int)1
吗?
true == 1
整型提升会应用,布尔值会被提升为int
类型,这个提升必须得到1。
参考资料:4.7 [conv.integral] / 4: 如果源类型是bool
... true
被转换成1。
true
是由该语言定义的关键字,无法被库重新定义。 #define
不允许重新定义关键字。 - jalf查尔斯·贝利(Charles Bailey)的答案是正确的。C++标准的确切措辞如下(§4.7 / 4):“如果源类型是bool,则值false转换为零,值true转换为一。”
编辑:我看到他已经添加了引用--如果我没有分心而忘记的话,我很快就会删除这个...
编辑2:然而,值得注意的是,虽然布尔值本身始终转换为零或一,但许多函数(尤其是来自C标准库的函数)返回的值是“基本上是布尔”的,它们被表示为int
,通常只需要为零以指示false或非零以指示true。例如,在<ctype.h>
中的is*函数仅需要零或非零,不必是零或一。
如果将其强制转换为bool
,则零将转换为false,非零将转换为true(正如您所期望的那样)。
根据标准,你的假设是安全的。C++ bool
类型只有两个值——true
和 false
,分别对应值 1 和 0。
需要注意的是,不要混淆 bool
表达式和变量与 BOOL
表达式和变量。后者被定义为 FALSE = 0
和 TRUE != FALSE
,实际上往往意味着任何非零值都被视为 TRUE
。
许多现代编译器实际上会对任何隐式尝试将 BOOL
值从非 0 或 1 的值转换为 bool
的代码发出警告。
我发现不同的编译器在true方面返回不同的结果。我也发现,与其将bool与int进行比较,最好将bool与bool进行比较。那些int往往随着程序的发展而改变值,如果您假设true为1,则可能会被代码中其他地方的不相关更改所影响。
true
是一个带有定义行为的语言关键字。如果您参考常见的宏定义(如 TRUE
),那么就是正确的。 - David Thornleybool
存储在 1 字节中,而不是 1 位。在一个有效的程序中,该字节只能存储值 0 或 1,但存在**未定义行为**的情况下,可能会在该字节中存储除 0 或 1 以外的值。编译器不会对这种情况进行补偿,这可能导致本答案所描述的经验。 - rustyx如果我写下以下代码:
int a=true;
cout<<a;
输出结果将是:
1
(bool)true==(int)1
。
bool t = true; int n = 1; if (t == n) {...} ;
。 - egrunin(int) true
作为整数的值是1
,但是像if (pointer)
这样的语句只有在pointer != 0
时才会执行其中的代码块。你可以假设的唯一真值是false == 0
,而true != 0
(当将true
强制类型转换为整数时,其值为1
)。 - Luis Colorado