我不确定下面的陈述是否由标准C明确定义
*p1++ += 2;
或其他类似声明:
*E1++ <operator>= E2
从标准C关于后增量:
postfix ++运算符的结果是操作数的值。 获得结果后,操作数的值递增。 (即,将相应类型的值1添加到其中。)请参阅 关于加法算子和复合赋值的讨论 有关约束,类型和转换以及影响的信息 对指针的操作。更新存储值的副作用 操作数应在前一个和下一个序列之间发生 点。
关于coumpund-assignment:
形式E1 op = E2的复合赋值不同于简单 赋值表达式E1 = E1 op(E2)仅在于左值E1是 只评估一次。
答案 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
可随时增加。