我知道下面的两个陈述给出了相同的结果:
a+=b;
a=a+b;
对于a += b
,a
仅评估一次,而在a = a + b
的情况下,a
评估两次。
两者之间的表现有什么不同?如果没有,上述哪些地方存在差异?
答案 0 :(得分:4)
从标准(第6.5.16.2节,第3点):
E1 op = E2 形式的复合作业不同于简单赋值表达式 * E1 = E1 op (E2)只是因为左值 E1 仅被评估一次
也就是说,如果您正在做
*a += 1
它只会确定目标位置一次而不是两次。对于像您的示例中的“简单”变量,它可能没有多大区别。当然,如果编译器知道不需要两次,它仍然可以优化并执行一次。如果有其他实体可以更改指针(例如另一个线程),则存在真正的差异。
编辑:也许更好的例子是像下面这样奇怪的事情(在我的情况下滥用& b ==& a-1这一事实):
int a, b, *p;
a = 1; b = 5; p = &a;
*p += (--p == &b) ? 1 : 0;
printf("%d %d\n",a,b); // prints 1 6, because --p happens first, then *p
a = 1; b = 5; p = &a;
*p = *p + ((--p == &b) ? 1 : 0);
printf("%d %d\n",a,b); // prints 1 2, because the second *p is evaluated first,
// then --p and then the first *p
答案 1 :(得分:1)
a+=1
可能是最好的方式(但性能差异几乎无关紧要)。如果您正在尝试实现某些性能改进,则应该查找代码的其他部分。