1

C 标准(最好是 C89,90)是怎么说的:

int a,b;
a = 4;
b = (a += 1);

?

我已经对其进行了测试,结果是b=5,这是我所期望的。我只是想对标准感到放心。这同样适用于类似的运算符,如*=, /=,&=等。我知道=在赋值后肯定会返回左侧的值。根据标准,我只想知道+=,*=等的行为是否相同。

4

3 回答 3

4

赋值运算符不会“返回”一个值:它们产生一个值,或者按照标准的说法,有一个值。

该值属于左操作数,尽管它不是左值。这是摘录:

(3.3.16) 赋值表达式在赋值后具有左操作数的值,但不是左值。

所有这些= *= /= %= += -= <<= >>= &= ^= |=都是赋值运算符,因此它们在这方面的行为方式相同。

于 2012-09-01T03:49:03.090 回答
1

除非有副作用,否则这不是问题。

赋值运算符不是序列点,这意味着无法保证评估的顺序。

如果你按照你给出的(b = (a += 1);)使用它,那不是问题。

但是,在其他情况下,这可能是一个问题,例如:

b = (a += 1) + a; // undefined

请注意,在此示例中,变量a被引用了两次。这意味着我们不知道是否先评估(a += 1)a先评估。所以我们不知道第二个引用a是在添加之前还是之后1

如果你只引用你用+=and co 分配的每个变量。一次,那么副作用就不是问题了,你可以指望和相关的运算符在赋值+=返回值。

于 2012-09-01T03:28:55.747 回答
0

这应该导致b = 5a = 5。这是因为a+=1需要a并添加1到它。然后它分配ab

我对你的问题有点困惑,但是,*=所有的工作方式都是一样的。/=-=

例如,您可以只拥有int c = 7; 然后在下一行做c*=3。这将使c = 21. 如果在您的示例中,您不想要a = 5; 那么就不要做a+=1,而是做a+1

于 2012-09-01T03:29:31.723 回答