i = i + j之间有什么区别; 和i + = j; 用c语言?

ani*_*rak 3 c gcc

有什么区别 i = i + j; 和i += j; 在C?它们是等价的吗?有副作用i吗?

我试图使用GCC编译器检查C中的赋值机制.

Car*_*rum 8

它们几乎是一样的.唯一的区别是,i+=案例中仅评估一次,而在另一种情况下评估两次.

  • @MichaelDorgan通常它没关系(并且会被优化掉,因为`i`会被塞进某个寄存器中),但是如果`i`是易变的并被其他线程或中断修改,那么它可能会引起关注.希望它_still_无关紧要,因为你已经正确地确保了[互斥](http://en.wikipedia.org/wiki/Mutual_exclusion),所以只有一个执行单元一次访问它. (5认同)
  • @MichaelDorgan:当`i`是一个比简单标识符更复杂的表达时,这很重要.例如,`*p(4)=*p(4)+ j`必须两次调用函数`p`(并且每次可能得到不同的结果),而`*p(4)+ = j`只调用`p `一次. (3认同)

hac*_*cks 5

i = i + j相当于但不相同 在某些情况下(罕见)不同于因为本身有副作用。 还有一个问题是运算符优先级,即i += j
i += ji = i + ji

i = i * j + k;
Run Code Online (Sandbox Code Playgroud)

不等于

i *= j + k;  
Run Code Online (Sandbox Code Playgroud)


Eri*_*low 5

几乎没有区别,但如果i是一个复杂的表达式,它只计算一次.假设你有:

int ia[] = {1, 2, 3, 4, 5};
int *pi = &(ia[0]);  // Yes, I know.  I could just have written pi = ia;
*pi++ += 10;
// ia now is {11, 2, 3, 4, 5}.
// pi now points to ia[1].
// Note this would be undefined behavior:
*pi++ = *pi++ + 10;
Run Code Online (Sandbox Code Playgroud)