关于将结果保存在内存中的顺序,这两种格式之间是否有任何区别?
number = number + 10;
number += 10;
我记得一种格式立即保存结果,因此下一行代码可以使用新值,而对于另一种格式,新值不能被下一行代码使用。我是对还是错?
答案 0 :(得分:2)
对于几乎所有实际目的而言,没有任何区别,至少在您询问的简单案例中。
C standard(链接到N1570草案),第6.5.15.2节说:
表单
E1
操作=
E2
< / strong>相当于 简单赋值表达式E1 = E1
op(E2)
,除了左值E1
仅评估一次,并且相对于 不确定顺序的函数调用,化合物的操作 分配是一个单一的评估。如果E1
具有原子类型,则为复合 赋值是使用memory_order_seq_cst
的读取 - 修改 - 写入操作 记忆顺序语义。
(上段的文字格式有点棘手; +=
是单个令牌,中间不能有空格。)
你可以放心地忽略大部分内容。我自己并不完全理解最后一句话。
相关的区别是number
如果你写
number = number + 10;
只有一次写
number += 10;
(每次出现在表达式中时,它都会被评估一次。)
现在,如果表达式只是变量的名称,则没有区别。在这两种情况下,相同的值都存储在number
中,整个表达式的结果(被丢弃,但可以用作更大表达式的一部分)是新的刚刚分配的价值。
如果number
被声明为 volatile ,则其评估的次数会影响您的计划行为。详细信息取决于number
的存储位置以及系统的特征。简而言之,volatile
禁止优化,要求编译器生成与您告诉它完全相同的代码。如果变量是某种与某个物理设备相连的特殊寄存器,它可以产生很大的不同。
如果不仅仅是number
你有一个更复杂的表达,那么评估它一次与两次也会产生很大的不同。例如:
int arr[100] = ...;
arr[rand() % 100] += 10;
arr[rand() % 100] = arr[rand() % 100] + 10;
第一个赋值会增加arr
的某个随机元素的值。第二个抓取arr
的一些随机元素的值,将其加10,并将结果存储在arr
的某个其他随机元素中(或者可能是同一个) ,因为rand()
每次调用时都会返回(可能)不同的结果。
但在简单的情况下,您要问:
number += 10;
VS
number = number + 10;
两个语句都做同样的事情,编译器可能为两者生成完全相同的代码。
像+=
这样的复合赋值运算符的主要目的是让你编写更短更清晰的代码(两个人不要总是在一起,但在这种情况下他们会这样做)。因为您只对单个变量进行操作,所以能够仅引用其名称一次是有意义的。对于更复杂的表达式,能够写:
a[b].c[d+42]->e += 10;
而不是
a[b].c[d+123]->e = a[b].c[d-123]->e;
不必多次输入目标名称可以降低错字引入错误的风险。 (您是否注意到第二版中的拼写错误?)