C/C++中使用复合赋值的真正优势是什么?
为什么C/C++中普通赋值语句里的表达式会被求值两次?
嘿,这个问题问得很关键!咱们结合你给出的代码例子来拆解,就能把这个问题说清楚:
#include <stdio.h> int main() { int exp1=20; int b=10; // 普通赋值语句 // exp1=exp1+b; // 复合赋值语句 exp1+=b; return 0; };
咱们先聚焦被注释掉的普通赋值语句 exp1 = exp1 + b;:
- 第一次求值:右边的
exp1。编译器需要先定位到exp1的内存地址,读取它当前存储的数值(也就是20),这是对exp1的第一次求值操作。 - 第二次求值:左边的
exp1。当计算完exp1 + b得到新值(30)后,编译器需要再次定位到exp1的内存地址,把新值写入进去,这就是对exp1的第二次求值操作。
而复合赋值语句exp1 += b;的逻辑就简洁很多:编译器只需要定位一次exp1的内存地址,先读出当前值完成加法计算,紧接着就把新值写回同一个地址——全程exp1只被求值一次。
这里还要提个关键点:如果exp1是带有副作用的表达式(比如arr[++i]这种),两种赋值方式的差异会直接导致逻辑错误。普通赋值会让i自增两次,而复合赋值只会自增一次,这也是复合赋值在这类场景下更安全的原因。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

