首页 > 解决方案 > 编译器如何在 if 语句中使用多个比较运算符评估表达式?

问题描述

所以我有这个程序返回“结果:真”

if (true == false != true) {
    cout << "result: true";
}
else {
    cout << "result: false";
}

即使我们翻转 if 语句中的比较运算符,编译器仍然会将表达式评估为真

if (true != false == true)

我的问题是:

  1. 编译器如何实际评估表达式?
  2. 以及在 if 语句中存在的两个比较运算符中,哪个比较运算符优先?

标签: c++if-statementcomparison-operators

解决方案


您的两个问题的答案都是运算符优先级==和运算符具有相同的!=优先级,这意味着它们将按照给定的顺序进行评估。

所以 in true == false != true, 被评估为(true == false) != true第一个语句true==false为假,完整的语句现在变为false!=true评估为true

同样,第 2 条语句true != false == true变为(true != false) == true最后评估true


编辑

在阅读了@Pete 的评论后,我又做了一些阅读。显然存在与这些情况相关的关联性

来自https://en.cppreference.com/w/cpp/language/operator_precedence

具有相同优先级的运算符在它们的关联性方向上绑定到它们的参数。例如,表达式 a = b = c 被解析为 a = (b = c),而不是 (a = b) = c,因为赋值的从右到左关联性,但 a + b - c 被解析(a + b) - c 而不是 a + (b - c),因为加法和减法的从左到右的关联性。


推荐阅读