首页 > 解决方案 > 为什么在这种情况下括号不能改变 C++ 运算符的优先级?

问题描述

这是我的简单代码:

int main()
{
    int x = 5;
    cout << (x++) << endl;

    return 0;
}

上面的代码打印5,而不是 6,即使有括号,我的想法是 x = x + 1 在打印出来之前先执行?谁能向我解释这里发生了什么?谢谢

编辑:我绝对理解 ++x 家伙,我的问题是关于使用 () 更改运算符优先级

标签: c++

解决方案


我绝对理解 ++x 伙计们,我的问题是关于使用 () 更改运算符优先级

运算符优先级与此无关。

误解可能不是你的错:你可能被误会了。您的老师告诉您,优先级高于其他操作数的操作数将“首先执行”。

虽然这是学校的常见解释,但事实并非如此。

从这个意义上说,有三件事可以改变表达式的含义:

 

  1. 运算符优先级

    这只是一组规则,告诉我们并告诉编译器,哪些操作数到哪个运算符。比如,3 + 5 * 7我们传递3+5给乘法运算符,还是传递5*7给加法运算符?这是关于解析的。

     

  2. 评估顺序

    然后需要对每个操作数进行求值以产生一个值(例如,3+5变为85*7变为35)。这些评估发生顺序的规则在 C++ 中非常复杂,比您预期的要复杂得多,但是您通常不必担心它们,除非您在序列点之间做一些疯狂的事情(借用 pre- C++11 用语)。

    (这是最接近“将首先执行”的概念。)

     

  3. 运算符的含义

    这就是你要在这里解开的地方。后缀增量运算符的含义x++是“增加 x,并计算为旧值”。时期。句号。

    哪个运算符优先级规则导致表达式x++被评估(与代码中符号的其他解释相反)并不重要:当它被评估时,无论何时它被评估,你都会得到x.

    然而,前缀增量运算符的含义++x是“增加 x,并计算新值”,这就是您想要的行为,所以这就是您应该编写的代码。

     

最终,实际产生这种行为的计算机指令序列完全取决于编译器,并且可能令人惊讶。您不必担心,只要程序的结果符合标准中的规定。

所以忘记这个“将首先执行”的东西吧;这是垃圾。


推荐阅读