* p ++ + = 2定义得很好吗?

时间:2014-10-17 02:49:45

标签: c++ c pointers post-increment compound-assignment

我不确定下面的陈述是否由标准C明确定义

*p1++ += 2;

或其他类似声明:

*E1++ <operator>= E2

从标准C关于后增量:

  

postfix ++运算符的结果是操作数的值。   获得结果后,操作数的值递增。   (即,将相应类型的值1添加到其中。)请参阅   关于加法算子和复合赋值的讨论   有关约束,类型和转换以及影响的信息   对指针的操作。更新存储值的副作用   操作数应在前一个和下一个序列之间发生   点。

关于coumpund-assignment:

  

形式E1 op = E2的复合赋值不同于简单   赋值表达式E1 = E1 op(E2)仅在于左值E1是   只评估一次。

2 个答案:

答案 0 :(得分:23)

让我们稍微重写以使其更清晰:

(*p1++) += 2

因此,p1的旧值将被取消引用,并且将在其指示对象中添加2。并且p1将在解除引用后递增(或者至少在其旧值加载并等待取消引用之后)。这里没有问题:没有一件被使用过多次。

话虽如此,为了清晰起见,您应该考虑重写代码:

*p1 += 2;
++p1;

答案 1 :(得分:3)

后缀增量运算符(++)给出操作数的值,即它给出 r值。 r值意味着它在赋值运算符(=)的左侧用作操作数。

int i = 0;
i++ = 0   // [Error] lvalue required as left operand of assignment  

如果是

*p1++ += 2;  

后缀++未应用于*p1,但它已应用于指针p1++。这是因为postfix ++的优先级高于derereference运算符*的优先级。因此,编译器会将上述语句解析为

*(p1++) += 2;

这就是说:

    在添加*p1并将结果分配给它之前,必须评估
  • 2(生成变量)。
  • 要存储到*p1的结果必须在增加到p1之前进行评估。
  • 评估*p1后,p1可随时增加。