C++中相等运算符的求值顺序
The order of evaluation of equality operator in C++
最近看了一些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?是否涉及相等运算符的求值顺序?
正如书上所说只有四个运算符保证顺序,不包括相等运算符。所以上面表达式的结果应该是未定义的,对吗?如果不是,应该是什么?
期待您的回复。提前致谢。
与评价顺序无关。比较运算符始终对其操作数执行 常规算术转换 。这些转换同样适用于两个操作数(尽管未指定顺序)。在将 bool
与另一个整数类型进行比较的情况下,类型 bool
的操作数始终首先提升为 int
。
==、<= 等关系运算符总是产生布尔值结果。这是称为 "the usual arithmetic conversions".
的一组规则的一部分
运算符的哪一侧被转换成什么以及以什么顺序转换有些深奥,编译器编写者会关心。这将超出程序员的范围。
if语句的条件有两种不同的类型
它们是:
- 整数
- 布尔值
在 c++ 类型中,例如:
- 布尔值
- 字符
- 短
总是首先转换为 int,因此在 if 的条件下,true 是 bool 被转换为 int 并且是 1 即,true 是 1 并且
val 保持不变。
最近看了一些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?是否涉及相等运算符的求值顺序?
正如书上所说只有四个运算符保证顺序,不包括相等运算符。所以上面表达式的结果应该是未定义的,对吗?如果不是,应该是什么?
期待您的回复。提前致谢。
与评价顺序无关。比较运算符始终对其操作数执行 常规算术转换 。这些转换同样适用于两个操作数(尽管未指定顺序)。在将 bool
与另一个整数类型进行比较的情况下,类型 bool
的操作数始终首先提升为 int
。
==、<= 等关系运算符总是产生布尔值结果。这是称为 "the usual arithmetic conversions".
的一组规则的一部分运算符的哪一侧被转换成什么以及以什么顺序转换有些深奥,编译器编写者会关心。这将超出程序员的范围。
if语句的条件有两种不同的类型 它们是:
- 整数
- 布尔值
在 c++ 类型中,例如:
- 布尔值
- 字符
- 短
总是首先转换为 int,因此在 if 的条件下,true 是 bool 被转换为 int 并且是 1 即,true 是 1 并且 val 保持不变。