“+ =”与正常加法之间的差异

时间:2015-08-22 08:56:33

标签: c

+ =和普通添加

有什么区别
a = a + b;
a += b;

以上两行有什么不同?
“+ =”运算符的CPU周期是否有任何增加?
哪种编码方法更可取。?

6 个答案:

答案 0 :(得分:3)

它们之间存在差异,并在C标准中进行了解释:

C11:6.5.16.2化合物分配(p3):

  

表单E1 = E1 op (E2)的合成赋值等同于简单赋值表达式E1,除了左值display:none;仅计算一次,并且对于不确定序列的函数调用,复合作业的操作是单一的评估。

答案 1 :(得分:3)

除了对第一个操作数进行单一评估之外,还存在第二个差异,即当b是表达式时发生,涉及具有较低优先级的运算符。例如:

int a = 1;
a += 0 || 1;

产生两个,而:

int a = 1;
a = a + 0 || 1;

将一个存储到a。以前的陈述相当于:

a = a + (0 || 1);

答案 2 :(得分:2)

当我编译以下两个程序时,

int main(int argc, char** argv)
{
  int a = 5, b = 10;

  a = a + b;

  return 0;
}

int main(int argc, char** argv)
{
  int a = 5, b = 10;

  a += b;

  return 0;
}

使用gcc file.c -S -O0,我得到以下汇编程序输出(这只是相关部分)

movl  $5, -4(%rbp)                     # Assign 5 to a
movl  $10, -8(%rbp)                    # Assign 10 to b
movl  -8(%rbp), %eax                   # Move b to eax
addl  %eax, -4(%rbp)                   # Add eax to a, store in a

这两种实现都产生了相同的输出。

但是,虽然一切都可以很好地处理整数和一次添加,但在某些情况下,您可能会得到不同的结果,请考虑double a,b操作a *= b*ba = b*a*b。如果特定乘法的结果无法准确表示,那么这两个操作将产生不同的结果。

答案 3 :(得分:0)

两个表达都是一样的。第二个是短手分配算子。这将有助于我们减少密码编码。

a = a + b; // Here a will come twice.

a += b;

这里将避免重复代码。

答案 4 :(得分:0)

差异仅在源头。输出二进制文件(可执行文件)完全相同(使用正常的当前编译器)。

在不同条件下,您可能会更喜欢其中一种。

我更喜欢简短形式,尤其是当a 复杂

vector[savedpos] = vector[savedpos] + 1000;
vector[savedpos] += 1000;

答案 5 :(得分:0)

Here是一个很好的解释。从来源引用

x + = y表示

  • 找到x
  • 标识的地点
  • 添加y

但是x = x + y表示:

  • 评估x + y

  • 找到x标识的地点

  • 将x复制到累加器
  • 将y添加到累加器
  • 将结果存储在x
  • 找到x
  • 标识的地点
  • 将累加器复制到它