编译器如何在 if 语句中评估带有多个比较运算符的表达式?
How does the compiler evaluates expression with multilple comparison operators inside of the if-statement?
所以我有这个程序returns“结果:真”
if (true == false != true) {
cout << "result: true";
}
else {
cout << "result: false";
}
即使我们翻转 if 语句中的比较运算符,编译器仍会将表达式计算为真
if (true != false == true)
我的问题是:
- 编译器实际上是如何计算表达式的?
- 在 if 语句中出现的两个比较运算符中,优先考虑哪个比较运算符?
你的两个问题的答案都是 operator precedence。 ==
和 !=
运算符具有相同的优先级,这意味着它们将按照给定的顺序进行计算。
因此在 true == false != true
中,被评估为 (true == false) != true
第一个语句 true==false
为假,完整语句现在变为 false!=true
,其评估为 true
类似地,第二条语句 true != false == true
变为 (true != false) == true
,最后计算结果为 true
编辑:
看完@Pete 的评论后,我又读了一些书。显然有一种关联性属性与这些情况有关
来自https://en.cppreference.com/w/cpp/language/operator_precedence
Operators that have the same precedence are bound to their arguments in the direction of their associativity. For example, the expression a = b = c is parsed as a = (b = c), and not as (a = b) = c because of right-to-left associativity of assignment, but a + b - c is parsed (a + b) - c and not a + (b - c) because of left-to-right associativity of addition and subtraction.
- 对于这种特殊情况,编译器从左到右计算表达式,因为“==”和“!=”具有相同的优先级。
- 如上所述,这两个运算符具有相同的优先级。
有关详细信息,请查看 C++ Operator Precedence
所以我有这个程序returns“结果:真”
if (true == false != true) {
cout << "result: true";
}
else {
cout << "result: false";
}
即使我们翻转 if 语句中的比较运算符,编译器仍会将表达式计算为真
if (true != false == true)
我的问题是:
- 编译器实际上是如何计算表达式的?
- 在 if 语句中出现的两个比较运算符中,优先考虑哪个比较运算符?
你的两个问题的答案都是 operator precedence。 ==
和 !=
运算符具有相同的优先级,这意味着它们将按照给定的顺序进行计算。
因此在 true == false != true
中,被评估为 (true == false) != true
第一个语句 true==false
为假,完整语句现在变为 false!=true
,其评估为 true
类似地,第二条语句 true != false == true
变为 (true != false) == true
,最后计算结果为 true
编辑:
看完@Pete 的评论后,我又读了一些书。显然有一种关联性属性与这些情况有关
来自https://en.cppreference.com/w/cpp/language/operator_precedence
Operators that have the same precedence are bound to their arguments in the direction of their associativity. For example, the expression a = b = c is parsed as a = (b = c), and not as (a = b) = c because of right-to-left associativity of assignment, but a + b - c is parsed (a + b) - c and not a + (b - c) because of left-to-right associativity of addition and subtraction.
- 对于这种特殊情况,编译器从左到右计算表达式,因为“==”和“!=”具有相同的优先级。
- 如上所述,这两个运算符具有相同的优先级。 有关详细信息,请查看 C++ Operator Precedence