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

Pet*_*uza 111 c++ casting boolean

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

CB *_*ley 128

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

true == 1
Run Code Online (Sandbox Code Playgroud)

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

参考:4.7 [conv.integral]/4:如果源类型是bool... true转换为1.

  • @jalf:确实允许#define定义系统关键字.C编译的预处理阶段纯粹是文本的,一般不知道关键字或C语法.然而,重新定义语言关键词当然几乎总是一个坏主意. (19认同)
  • @Joshua:`true`是由该语言定义的关键字.它不能由图书馆重新定义.`#define`s不允许重新定义关键字. (9认同)
  • C99,§6.10.1/ 1说:"控制条件包含的表达式应为整数常量表达式,除了:它不应包含强制转换;标识符(包括与关键字词法相同的那些)的解释如下所述;" 虽然没有说明是直接许可,但这清楚地考虑了与关键字"词法相同"的宏的可能性. (3认同)
  • @jalf.他们不是?请参阅http://gcc.gnu.org/onlinedocs/cpp/Macros.html,以及国际混淆C代码竞赛中的至少一个条目,该竞赛曾经问过"什么时候"不需要一段时间?(答案:当它需要两个参数时,因为那个条目已经``define`它到`printf`.) (2认同)
  • 哦,允许#defines重新定义关键字.C++ 1x对其新关键字造成了太多问题,因此必须删除需求. (2认同)

Jer*_*fin 18

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

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

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

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


Fra*_*nov 8

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

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

很多现代编译器实际上会发出隐含试图从施放任何代码的警告BOOLbool,如果该BOOL值大于0或1的不同.


Mic*_*gan 6

我发现不同的编译器在 true 上返回不同的结果。我还发现,比较 bool 与 bool 而不是 int 几乎总是更好。随着程序的发展,这些整数的值往往会随着时间的推移而改变,如果你假设 true 为 1,那么你可能会受到代码中其他地方不相关的更改的影响。

  • 对于 C++ 来说,这是一个错误的答案,因为“true”是具有定义行为的语言关键字。如果您引用常用定义的宏,例如“TRUE”,那么它是正确的。 (4认同)