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

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

118942 次浏览

是的,石膏是多余的,用你的话说:

true == 1

整体推广应用和布尔值将被提升到一个 int,这个推广必须产生1。

参考文献: 4.7[ conv.Integrt ]/4: 如果源类型为 bool... ... true将转换为1。

我发现不同的编译器对 true 返回不同的结果。我还发现,将 bool 比作 bool 而不是 int 几乎总是更好。随着程序的发展,int 类型的值会随着时间的推移而改变,如果假设为1,则可能会在代码的其他地方受到与之无关的更改的影响。

查尔斯 · 贝利的回答是正确的。C + + 标准的确切措辞是(4.7/4) : “如果源类型为 bool,则将值 false 转换为0,将值 true 转换为1。”

编辑: 我看到他也添加了参考文献——我会很快删除它,如果我没有分心和忘记..。

编辑2: 然后,可能值得注意的是,虽然布尔值本身总是转换为零或一,一些函数(特别是从 C 标准库)返回的值“基本上是布尔值”,但表示为 int,通常只需要为0表示假或非零表示真。例如,<ctype.h>中的 is * 函数只需要零或非零,不一定是零或一。

如果将其强制转换为 bool,则0将转换为 false,而非0将转换为 true (正如您所预期的那样)。

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

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

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

如果我写代码:

int a=true;
cout<<a;

产出将是:

1

所以,是的,你可以假设 (bool)true==(int)1