16

我不确定下面的语句是否由标准 C 定义好

*p1++ += 2;

或其他类似声明:

*E1++ <operator>= E2

从标准 C 关于后增量:

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

关于复数赋值:

E1 op= E2 形式的复合赋值与简单赋值表达式 E1 = E1 op (E2) 的不同之处仅在于左值 E1 仅计算一次。

4

2 回答 2

23

让我们稍微重写一下以使其更清楚:

(*p1++) += 2

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

话虽这么说,为了清楚起见,您应该考虑重写代码:

*p1 += 2;
++p1;
于 2014-10-17T02:56:10.547 回答
3

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

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

的情况下

*p1++ += 2;  

后缀++不应用于*p1,但应用于指针p1++。这是因为 postfix++比 derereference operator 具有更高的优先级*。因此,编译器会将上述语句解析为

*(p1++) += 2;

这说明:

  • *p12必须在添加结果并将结果分配给它 之前对其进行评估(以产生变量) 。
  • 要存储到的结果*p1必须在递增到 之前进行评估p1
  • 一旦*p1被评估,p1可以随时递增。
于 2014-10-17T10:02:49.270 回答