Java中表达式"a[1] *= a[1] = b[n + 1]"为何未按预期运行?
为什么你的数组赋值乘方代码不符合预期?
兄弟,你踩了C/C++里一个经典的坑——未定义行为,这就是代码实际运行和你预期不符的核心原因。
咱们先拆解你写的代码:a[0] *= a[0] = b[n];
你预期的执行顺序是:
- 把
b[n]的值赋给a[0] - 用新的
a[0]值和自身相乘(也就是平方)
但问题在于,C/C++标准没有规定复合赋值操作中左右操作数的求值顺序。编译器完全可以选择先读取a[0]的原始值,再执行a[0] = b[n]的赋值,最后用原始值和新赋值的结果相乘。
举个实际例子:假设a[0]初始是0,b[n]是5。如果编译器先读原始的0,再把a[0]设为5,最后计算0 * 5,结果就是0,完全不是你想要的25。
正确的写法
别把两步逻辑揉在一行里,拆分出来就彻底避免了求值顺序的问题:
// 先完成赋值 a[0] = b[n]; // 再执行平方操作 a[0] *= a[0];
或者更高效的写法,直接计算平方后赋值,连临时变量的中间步骤都省了:
a[0] = b[n] * b[n];
记住一个原则:在C/C++里,不要在同一个表达式里对同一个变量既赋值又读取(除非是有明确序列点分隔的情况),否则结果完全不可控——不同编译器、甚至同一编译器的不同优化等级都可能给出不一样的结果。
内容的提问来源于stack exchange,提问作者Hex Crown
相关产品推荐
相关产品推荐

