【问题标题】:Are C++ bools converted to ints during comparison?比较期间 C++ 布尔值是否转换为整数?
【发布时间】:2016-03-15 23:16:06
【问题描述】:

在 C++ 中使用比较运算符时,布尔值是否会转换为整数?

我问的原因是,是否总是明确比较 if 语句中的真/假的问题出现了。两个选项是:

1) if (my_bool == true) doSomething();
2) if (my_bool) doSomething();

我们认为您通常应该避免显式比较 (1),原因如下:

int myFunc(){return 4;}
if (myFunc() == true) doSomething();

如果您需要使用简单地返回非零来表示“真”的 C 接口,就会出现类似上述代码的内容。 myFunc() 示例在 C 中会失败,因为 myFunc 返回 4,true 被宏定义为 1,而 4 == 1 不正确。

在 C++ 中仍然是这种情况吗? “等于”运算符是否将 bool 转换为 int 而不是相反?对标准的引用(我正在使用 C++11)表示赞赏,但如果它在我有兴趣了解的语言版本之间有所不同。

(我想具体询问一下明确的真假比较的利弊,但这似乎是主观的。)

【问题讨论】:

  • 假设if (myBool == true)if (myBool)好,那么显然if ((myBool == true) == true)更好!

标签: c++


【解决方案1】:

在 C++ 中使用比较运算符时,布尔值是否会转换为整数?

是的。对于关系运算符([expr.rel]/5):

通常的算术转换是在算术或枚举类型的操作数上执行的。

对于等式运算符 ([expr.eq]/6):

如果两个操作数都是算术或枚举类型,通常的算术转换是在 两个操作数;

当两个操作数都是bool 时,它们都被提升为int。如果一个操作数是bool 而另一个是整数类型,则bool 操作数将提升为int。见[expr]/10:

否则,应在两个操作数上执行积分提升 (4.5)。

据我所知,从一开始就是这样(标准的修订版之间没有区别)。

我认为与truefalse 进行显式比较不会对性能产生任何影响,但我自己不会这样做,因为我认为它是多余的,而且不会产生任何好处。

【讨论】:

  • 谢谢!我不太关心性能,而是关心每种方法的安全性和潜在缺陷。
  • 性能不是问题。编译器对布尔值的理解足以优化任何合理的变化。
【解决方案2】:

它们没有被转换,bool 实际上是整数类型。

查看标准:

“bool 类型的值为真或假。如下所述,bool 值表现为整数类型。bool 类型的值参与整数提升”~C++03

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2016-07-17
    • 2018-10-22
    • 2011-12-26
    相关资源
    最近更新 更多