这是我的简单代码:
int main()
{
int x = 5;
cout << (x++) << endl;
return 0;
}
上面的代码打印5
,不是 6,即使有括号,我的想法是 x = x + 1 在打印之前先执行?谁能向我解释一下这是怎么回事?谢谢
编辑:我绝对理解 ++x 的家伙,我的问题是关于使用 () 更改运算符优先级
我绝对理解 ++x 的家伙,我的问题是关于使用 () 更改运算符优先级
运算符优先级与此无关。
这种误解可能不是你的错:你可能被误导了。您的老师告诉您,优先级高于其他操作数的操作数将“首先执行”。
虽然这是一个共同的解释 https://softwareengineering.stackexchange.com/a/300808/17853在学校,这不是真的。
在这个意义上,有三件事可以改变表达式的含义:
-
运算符优先级
这只是一组规则,告诉我们并告诉编译器哪些操作数属于哪个运算符。像3 + 5 * 7
,我们通过吗3+5
到乘法运算符,或者我们传递5*7
到加法运算符?是关于parsing.
-
评估顺序
然后需要评估每个操作数以产生一个值(例如3+5
变成8
, or 5*7
变成35
)。在 C++ 中,这些求值发生的顺序规则非常复杂,比您想象的还要复杂,但您通常不必担心它们,除非您在序列点之间做疯狂的事情(借用 pre- C++11 的说法)。
(这是最接近“将首先执行”的概念。)
-
运算符的含义
这就是你要摆脱困境的地方。后缀自增运算符的含义x++
是“增加x,并评估旧值”。时期。句号。
哪个运算符优先级规则导致表达式并不重要x++
被求值(与代码中符号的其他解释相反):当它被求值时,whenever它被评估,你得到旧值x
.
的含义prefix增量运算符++x
然而,是“增加 x,并计算出新值”,这就是您想要的行为,因此这就是您应该编写的代码。
最终,计算机指令的顺序实际上会产生这种行为完全取决于编译器,并且可能会令人惊讶。您不必担心,只要程序的结果符合标准中指定的即可。
所以忘记这个“将首先执行”的东西吧;这是垃圾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)