C ++中等式运算符的求值顺序

时间:2015-02-04 06:03:57

标签: c++ equality operator-precedence

最近我读了一些C ++ Primer的章节,有一件事让我感到困惑。

这本书说:

There are four operators that do guarantee the order in which operands are evaluated. 
the logical AND (&&) operator, 
the logical OR (||) operator, 
the conditional (? :) operator, 
and the comma (,) operator.    

然后我看到了这些代码:

     if (val == true) { /* ... */ } // true only if val is equal to 1!

然后这本书解释了:

If val is not a bool, then true is converted to the type of val before the == operator is applied.
That is, when val is not a bool, it is as if we had written
     if (val == 1) { /* ... */ }

这是我的问题:

为什么bool类型 true 转换为算术类型,而不是 val ?是否涉及平等算子的评估顺序?

正如本书所说,只有四个运营商保证订单,不包括平等运营商。所以上面表达式的结果应该是未定义的,对吗?如果没有,应该是什么?

期待您的回复。提前谢谢。

3 个答案:

答案 0 :(得分:2)

它与评估顺序无关。比较运算符始终在其操作数上执行通常的算术转换。这些转换同样适用于两个操作数(尽管订单未指定)。在将bool与另一个整数类型进行比较的情况下,类型bool的操作数始终首先提升为int

答案 1 :(得分:0)

==,< =等关系运算符总是产生布尔结果。这是一组称为“通常的算术转换”的规则的一部分。

运算符的哪一侧转换为什么,以什么顺序转换为有些深奥,并且会关注编译器编写者。这将超出程序员的范围。

答案 2 :(得分:0)

在if语句的条件下有两种不同的类型 这些是:

  1. INT
  2. BOOL
  3. 在c ++类型中,例如:

    1. BOOL
    2. 总是首先转换为int,因此在if,true的条件下,bool转换为int并且为1,即true为1且  val保持不变。