You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:42:35