C标准(最好是C89,90)说了什么:
int a,b;
a = 4;
b = (a += 1);
我测试了它,结果是b=5
,这是我所期待的。我只是想让标准放心。这同样适用于类似的运算符,例如*=
,/=
,&=
等。我知道=
肯定会在分配后返回左侧的值。根据标准,我只想知道+=
,*=
等行为方式是否相同。
答案 0 :(得分:4)
赋值运算符不会“返回”一个值:它们产生一个值,或者正如标准所说,它有一个值。
该值是左操作数,但它不是左值。这是摘录:
(3.3.16)赋值表达式在赋值后具有左操作数的值,但不是左值。
所有= *= /= %= += -= <<= >>= &= ^= |=
都是赋值运算符,因此它们在这方面的行为方式相同。
答案 1 :(得分:1)
除非有副作用,否则这不是问题。
赋值运算符不是序列点,这意味着无法保证评估顺序。
如果您按照给定(b = (a += 1);
)使用它,则不是问题。
但是,在其他情况下,可能会出现问题,例如:
b = (a += 1) + a; // undefined
请注意,在此示例中,变量a
被引用两次。这意味着我们不知道是先评估(a += 1)
还是a
。因此,我们不知道a
的第二次引用是否会在添加1
之前或之后。
如果您只引用您使用+=
和co分配的每个变量。一旦,副作用不是问题,您可以依靠+=
及相关运算符在赋值后返回值。
答案 2 :(得分:0)
这应该会产生b = 5
和a = 5
。
这是因为a+=1
需要a
并向其添加1
。然后它将a
分配给b
。
我对您的问题感到困惑,但*=
,/=
,-=
的工作方式相同。
例如,您可以拥有int c = 7
;然后在下一行做c*=3
。这将使c = 21
。如果在您的示例中,您不想要a = 5
;然后不要做a+=1
,而是做a+1
。