代码之家  ›  专栏  ›  技术社区  ›  Petruza

对于任何C++编译器,我能假定(BOOL)真==(int)1吗?

  •  109
  • Petruza  · 技术社区  · 15 年前

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

    5 回复  |  直到 15 年前
        1
  •  127
  •   Joe    15 年前

    对。铸件是多余的。在你的表达中:

    true == 1
    

    整体提升应用,bool值将提升为 int 这一提升必须产生1。

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

        2
  •  18
  •   Jerry Coffin    15 年前

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

    编辑:我看到他也添加了参考资料--如果我不分心忘记的话,我会很快删除这个…

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

    如果你把它投到 bool ,零将转换为假,而非零将转换为真(如您所料)。

        3
  •  7
  •   Franci Penov    15 年前

    根据标准,你应该安全地接受这个假设。C++ bool 类型有两个值- true false 对应值为1和0。

    要注意的是混合 布尔 表达式和变量 BOOL 表达式和变量。后者定义为 FALSE = 0 TRUE != FALSE ,这通常在实践中意味着考虑任何不同于0的值 TRUE .

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

        4
  •  4
  •   Michael Dorgan    15 年前

    我发现不同的编译器在true上返回不同的结果。我还发现,比较bool和bool,而不是int,几乎总是更好的方法。随着程序的发展,这些int会随着时间的推移而改变值,如果假设为1,则代码中其他地方的不相关更改会咬到它们。

        5
  •  -9
  •   Sukasa    15 年前

    不,在编译器中,true可以是任意的。一些使用1,一些使用-1(所有位集,有符号var),其他编译器可能使用不同的值。即使该值是标准化的,也不是所有编译器都可以遵循该标准。

    但是,当所有位都清除时,则为假,这只发生在数值0上。