C 区别于+=&引用;和正规加法

C 区别于+=&引用;和正规加法,c,C,+=和普通加法有什么区别 a = a + b; a += b; 以上两行有什么不同? “+=”运算符的CPU周期是否增加? 哪一种是更好的编码方法?这两个表达式是相同的。第二种是速记赋值运算符。这将帮助我们减少重复编码 a = a + b; // Here a will come twice. a += b; 在这里,代码的重复将被避免。区别仅在源代码中。输出二进制文件(可执行文件)完全相同(与当前的普通编译器相同) 在不同的条件下,你可能更喜欢其中一种 我更喜欢缩写形式,尤其是当a很复杂

+=和普通加法有什么区别

a = a + b;
a += b;
以上两行有什么不同?
“+=”运算符的CPU周期是否增加?

哪一种是更好的编码方法?

这两个表达式是相同的。第二种是速记赋值运算符。这将帮助我们减少重复编码

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

a += b;

在这里,代码的重复将被避免。

区别仅在源代码中。输出二进制文件(可执行文件)完全相同(与当前的普通编译器相同)

在不同的条件下,你可能更喜欢其中一种

我更喜欢缩写形式,尤其是当
a
很复杂时

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

x+=y意味着

  • 找到由x标识的位置
  • 再加上y
但是x=x+y意味着:

  • 计算x+y

  • 找到由x标识的位置

  • 将x复制到累加器中
  • 将y添加到累加器中
  • 将结果存储在x中
  • 找到由x标识的位置
  • 将累加器复制到它

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

C11:6.5.16.2化合物分配(p3): 形式为
E1 op=E2
的复合赋值等价于简单赋值表达式
E1=E1 op(E2)
,除了左值
E1
只求值一次,并且对于不确定顺序的函数调用,复合赋值的操作是单一求值


当我编译以下两个程序时

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
,我得到以下汇编程序输出(这只是相关部分)

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


但是,尽管所有的事情都很好地与整数和一个加法运算,但也有可能得到不同的结果,考虑<代码>双A、B < /代码>操作<代码> A*= B*B和<代码> A= B*A*B。如果特定乘法的结果不能精确表示,那么这两个运算将产生不同的结果。

除了第一个操作数的单一计算之外,还有第二个差异,当
b
是一个表达式,涉及优先级较低的运算符时,会出现这种差异。例如:

int a = 1;
a += 0 || 1;
产生两个,而:

int a = 1;
a = a + 0 || 1;
将一个存储到
a
中。与前一项声明相当的是:

a = a + (0 || 1);

有了一个好的编译器,大多数人都会使用第二种形式,因为它的重复性比较少,所以不会有任何区别(大多数情况下)。输入速度更快,人类更容易解析,而且出错的地方更少。然而,也有一些编程风格是不一致的。除了ilent2的注释之外,你应该始终坚持
a+=b因为它涉及更少的类型。@ BANX你在考虑C++,但是这个问题被标记为C。C中没有操作符重载。首选方法将是符合规范的方法。正如下面提到的,这两者之间存在差异,您使用的一个取决于许多标准。不要忘记表达式“a”可能有副作用,因此上面的两个版本可能会产生不同的结果!回答错了。两个表达式都不相同,但都产生相同的结果。如果您是对的,则+=的CPU周期比norma add花费的时间要少。@sujaiMJ-不,编译器的优化器知道它们具有相同的效果,并将消除任何差异。如回答中所述,
实际实现取决于处理器的实际指令集。因此可能会发生这种情况
int a = 1;
a = a + 0 || 1;
a = a + (0 || 1);