为什么在这种情况下括号无法更改c ++运算符优先级?

Jer*_*emy -5 c++

这是我的简单代码:

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印出的5不是6,即使带括号,我的想法是在打印出来之前先执行x = x + 1吗?谁能告诉我这是怎么回事?谢谢

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

Bat*_*eba 5

(x++)带有或不带有括号的表达式的计算结果为的先前值x,并具有增加的副作用x

如果要查看增加的效果,请使用晦涩的

cout << (x++, x) << endl;
Run Code Online (Sandbox Code Playgroud)

  • ..但是请不要真正用任何真实的代码编写它:-O (2认同)
  • @underscore_d:有时候,如果某些zonkey错误地实现了“ ++ x”,并且您不能强制立即修复,则必须这样做。 (2认同)

Lig*_*ica 5

我肯定了解++ x家伙,我的问题是关于使用()的更改运算符优先级

运算符优先级与此无关。

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

尽管这是学校中的常见解释但事实并非如此。

在这种意义上,有三件事可以改变表达式的含义:

 

  1. 运算符优先级

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

     

  2. 评估顺序

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

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

     

  3. 运算符的含义

    这是您要解脱的地方。后缀递增运算符的含义x++是“递增x,并求出旧值”。期。句号

    哪个运算符优先级规则导致表达式x++被求值(与代码中符号的其他解释相反)无关紧要:在求值时,无论何时求值,您都会获得的旧值x

    但是,前缀递增运算符的含义++x是“递增x,并求出新值”,这就是您想要的行为,因此这就是您应该编写的代码。

     

最终,什么计算机指令序列实际产生此行为完全取决于编译器,这可能令人惊讶。只要程序的结果与标准中指定的一样,您就不必担心。

因此,只需忘掉这些“将首先执行”的东西即可;这是垃圾。