c++ - 为什么在这种情况下括号不能改变 C++ 运算符的优先级?
问题描述
这是我的简单代码:
int main()
{
int x = 5;
cout << (x++) << endl;
return 0;
}
上面的代码打印5
,而不是 6,即使有括号,我的想法是 x = x + 1 在打印出来之前先执行?谁能向我解释这里发生了什么?谢谢
编辑:我绝对理解 ++x 家伙,我的问题是关于使用 () 更改运算符优先级
解决方案
我绝对理解 ++x 伙计们,我的问题是关于使用 () 更改运算符优先级
运算符优先级与此无关。
误解可能不是你的错:你可能被误会了。您的老师告诉您,优先级高于其他操作数的操作数将“首先执行”。
虽然这是学校的常见解释,但事实并非如此。
从这个意义上说,有三件事可以改变表达式的含义:
运算符优先级
这只是一组规则,告诉我们并告诉编译器,哪些操作数到哪个运算符。比如,
3 + 5 * 7
我们传递3+5
给乘法运算符,还是传递5*7
给加法运算符?这是关于解析的。评估顺序
然后需要对每个操作数进行求值以产生一个值(例如,
3+5
变为8
或5*7
变为35
)。这些评估发生顺序的规则在 C++ 中非常复杂,比您预期的要复杂得多,但是您通常不必担心它们,除非您在序列点之间做一些疯狂的事情(借用 pre- C++11 用语)。(这是最接近“将首先执行”的概念。)
运算符的含义
这就是你要在这里解开的地方。后缀增量运算符的含义
x++
是“增加 x,并计算为旧值”。时期。句号。哪个运算符优先级规则导致表达式
x++
被评估(与代码中符号的其他解释相反)并不重要:当它被评估时,无论何时它被评估,你都会得到x
.然而,前缀增量运算符的含义
++x
是“增加 x,并计算新值”,这就是您想要的行为,所以这就是您应该编写的代码。
最终,实际产生这种行为的计算机指令序列完全取决于编译器,并且可能令人惊讶。您不必担心,只要程序的结果符合标准中的规定。
所以忘记这个“将首先执行”的东西吧;这是垃圾。
推荐阅读
- google-sheets - 谷歌电子表格的这个视觉错误是什么?我该如何解决?
- python - 如何遍历文件夹并将文件保存为熊猫数据框?
- python - 是否可以在 tkinter 中修改徽标的大小?
- python - 使用 apply get ValueError 解包多列列表:如果使用所有标量值,则必须传递索引
- python - 数学/文本删除器后的Python自动文本?
- excel - 在excel中填写行,如果其他行有数据
- c++ - Sherlock 和 Array hackerrank 问题在测试用例上的“错误答案”
- python - 带有opencv的树莓派相机坏了
- python - 逗号分隔的参数评估
- c++ - 有点复杂的 C2102: '&' 需要左值错误