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