CPP 中的优先顺序

时间:2021-06-28 06:40:24

标签: c++

在以下代码中:

#include<iostream>
using namespace std;
int main()
{
    int x = 1 , y = 1, z = 1;
    cout << ( ++x || ++y && ++z ) << endl; //outputs 1;
    cout << x << " " << y << " " << z ;  //x = 2 , y = 1 , z = 1;
    return 0;
}

据我所知,逻辑 AND 应该先求值,然后是逻辑 OR。然而,结果似乎与我的假设相反。谁能解释一下?

3 个答案:

答案 0 :(得分:2)

operator&&precedenceoperator|| 高,这意味着 ++x || ++y && ++z 将被解释为 ++x || (++y && ++z),这并不意味着 (++y && ++z) 得到首先评价。 ++x 仍然首先被评估,它给出一个非零值可以转换为 bool 的值为 true,然后 (++y && ++z) 不会被评估,因为 {{3 }}。

答案 1 :(得分:2)

运算符 ||&& 是短路的(如果没有过载)。

因此,对于 ||:如果第一个参数是 true,则不计算第二个参数。

对于 &&:如果第一个是 false,则不计算第二个。

如果 a 中的 a || (b && c)true,则不会对第二个表达式包含的任何内容求值。

(我设置了括号(实际上不是必需的)来强调 || 的第二个参数是什么。)

答案 2 :(得分:0)

您似乎将运算符的优先级与求值顺序混淆了。是的,&& 的优先级高于 ||,因此 ++x || ++y && ++z 被评估为 ++x || (++y && ++z),但它仍然是从左到右评估。

另见Order of evaluation

<块引用>
  1. 内置逻辑 AND 运算符 && 和内置逻辑 OR 运算符的第一个(左)参数的每个值计算和副作用 ||在每个值计算和第二个(右)参数的副作用之前排序。

也就是说,|| 的左参数将始终在右参数之前进行评估。因此 ++x first 被评估,这产生 true 和条件 short-circuits,所以 (++y && ++z) 根本不被评估。