编译器如何在 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)

我的问题是:

  1. 编译器实际上是如何计算表达式的?
  2. 在 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.

  1. 对于这种特殊情况,编译器从左到右计算表达式,因为“==”和“!=”具有相同的优先级。
  2. 如上所述,这两个运算符具有相同的优先级。 有关详细信息,请查看 C++ Operator Precedence