最近我读了一些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 ?是否涉及平等算子的评估顺序?
正如本书所说,只有四个运营商保证订单,不包括平等运营商。所以上面表达式的结果应该是未定义的,对吗?如果没有,应该是什么?
期待您的回复。提前谢谢。
答案 0 :(得分:2)
它与评估顺序无关。比较运算符始终在其操作数上执行通常的算术转换。这些转换同样适用于两个操作数(尽管订单未指定)。在将bool
与另一个整数类型进行比较的情况下,类型bool
的操作数始终首先提升为int
。
答案 1 :(得分:0)
==,< =等关系运算符总是产生布尔结果。这是一组称为“通常的算术转换”的规则的一部分。
运算符的哪一侧转换为什么,以什么顺序转换为有些深奥,并且会关注编译器编写者。这将超出程序员的范围。
答案 2 :(得分:0)
在if语句的条件下有两种不同的类型 这些是:
在c ++类型中,例如:
总是首先转换为int,因此在if,true的条件下,bool转换为int并且为1,即true为1且 val保持不变。