+ =在分配后返回左侧的值吗?

时间:2012-09-01 03:22:56

标签: c

C标准(最好是C89,90)说了什么:

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

我测试了它,结果是b=5,这是我所期待的。我只是想让标准放心。这同样适用于类似的运算符,例如*=/=&=等。我知道=肯定会在分配后返回左侧的值。根据标准,我只想知道+=*=等行为方式是否相同。

3 个答案:

答案 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 = 5a = 5。 这是因为a+=1需要a并向其添加1。然后它将a分配给b

我对您的问题感到困惑,但*=/=-=的工作方式相同。

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