+ =和普通添加
有什么区别a = a + b;
a += b;
以上两行有什么不同?
“+ =”运算符的CPU周期是否有任何增加?
哪种编码方法更可取。?
答案 0 :(得分:3)
它们之间存在差异,并在C标准中进行了解释:
表单
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*b
和a = 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 = x + y表示:
评估x + y
找到x标识的地点