【问题标题】:Does += return the value of the left hand side after assignment?+= 赋值后是否返回左侧的值?
【发布时间】:2012-09-01 03:22:56
【问题描述】:

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

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

?

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

【问题讨论】:

  • 返回哪一边都没关系。它们是一样的。
  • 在 C++ 中,对于非 POD 类型,它会调用赋值运算符。一切顺利。
  • @Mysticial 取决于您在a+=1 中右侧的意思。另外,我想要 C,而不是 C++。而且我不知道 POD 是什么...

标签: c


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    但是,在其他情况下,可能会出现问题,例如:

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

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

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

    【讨论】:

      【解决方案3】:

      这应该导致b = 5a = 5。 这是因为a+=1 接受a 并添加1。然后它将a 分配给b

      我对你的问题有点困惑,但是*=/=-= 都以相同的方式工作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        相关资源
        最近更新 更多