之间的区别:数字=数字+10;和数字+ = 10;

时间:2015-01-28 22:22:29

标签: c

关于将结果保存在内存中的顺序,这两种格式之间是否有任何区别?

number = number + 10;
number += 10;  

我记得一种格式立即保存结果,因此下一行代码可以使用新值,而对于另一种格式,新值不能被下一行代码使用。我是对还是错?

1 个答案:

答案 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;

不必多次输入目标名称可以降低错字引入错误的风险。 (您是否注意到第二版中的拼写错误?)