C++中括号内赋值与运算的执行顺序疑问
关于C++代码
prev += prev * (prev = current);的执行顺序问题 先看你提到的代码:
prev += prev * (prev = current);
你疑惑的点是:为什么括号里的prev = current没先执行,本该得到current * current的结果,实际却是先用原来的prev乘current,再把current赋值给prev?
核心原因有两个:
- 括号只管优先级,不管求值顺序
括号的作用只是让prev = current作为乘法的右操作数,确保它先参与乘法运算,但它不会强制这个赋值操作必须在乘法的左操作数(也就是原来的prev)求值之前执行。C++里除了&&、||、?:、逗号运算符这几个少数情况,大多数运算符的操作数求值顺序是编译器说了算的——它可以先算左边的prev,再算括号里的赋值,也可以反过来。 - 这段代码本身属于未定义行为
在同一个表达式里,prev既被修改(prev = current),又被读取(prev * ...里的prev),而且读取的不是修改后的值。这种情况C++标准完全不规定程序该怎么运行,不同编译器、不同编译参数跑出来的结果可能都不一样,甚至可能出现莫名其妙的错误。
如果想要明确的结果,别把这些操作揉在一个表达式里,拆分成分开的语句才是稳妥的:
- 如果想要先把
prev设为current,再让它加上自身的平方:
prev = current; prev += prev * prev;
- 如果想要用原来的
prev值乘current,再把结果加到变成current后的prev上:
int old_prev = prev; prev = current; prev += old_prev * prev;
内容的提问来源于stack exchange,提问作者user11950757
相关产品推荐
相关产品推荐

