这是我的简单代码:
int main()
{
int x = 5;
cout << (x++) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码打印出的5不是6,即使带括号,我的想法是在打印出来之前先执行x = x + 1吗?谁能告诉我这是怎么回事?谢谢
编辑:我肯定理解++ x家伙,我的问题是关于使用()的更改运算符优先级
(x++)带有或不带有括号的表达式的计算结果为的先前值x,并具有增加的副作用x。
如果要查看增加的效果,请使用晦涩的
cout << (x++, x) << endl;
Run Code Online (Sandbox Code Playgroud)
我肯定了解++ x家伙,我的问题是关于使用()的更改运算符优先级
运算符优先级与此无关。
误会可能不是您的错:您可能被误会了。您的老师告诉您,比其他操作数优先级更高的操作数将“首先执行”。
尽管这是学校中的常见解释,但事实并非如此。
在这种意义上,有三件事可以改变表达式的含义:
运算符优先级
这只是一组规则,它们告诉我们并告诉编译器哪些操作数到达哪个运算符。就像在中3 + 5 * 7,我们传递3+5给乘法运算符,还是传递5*7给加法运算符?这是关于解析。
评估顺序
然后需要评估每个操作数以产生一个值(例如,3+5变为8或5*7变为35)。在C ++中,这些评估发生顺序的规则相当复杂,比您预期的要复杂得多,但是通常不必担心它们,除非您在序列点之间做疯狂的事情(借用预先C ++ 11的说法)。
(这是最接近“将首先执行”的概念。)
运算符的含义
这是您要解脱的地方。后缀递增运算符的含义x++是“递增x,并求出旧值”。期。句号
哪个运算符优先级规则导致表达式x++被求值(与代码中符号的其他解释相反)无关紧要:在求值时,无论何时求值,您都会获得的旧值x。
但是,前缀递增运算符的含义++x是“递增x,并求出新值”,这就是您想要的行为,因此这就是您应该编写的代码。
最终,什么计算机指令序列实际产生此行为完全取决于编译器,这可能令人惊讶。只要程序的结果与标准中指定的一样,您就不必担心。
因此,只需忘掉这些“将首先执行”的东西即可;这是垃圾。