我不确定下面的语句是否由标准C语言很好地定义
*p1++ += 2;
或其他类似的声明:
*E1++ <operator>= E2
从标准C到后增量:
后缀++运算符的结果是操作数的值。获得结果后,操作数的值递增。(也就是说,相应类型的值1将添加到该值中。)有关约束、类型和转换以及操作对指针的影响的信息,请参阅对加法运算符和复合赋值的讨论。更新操作数存储值的副作用应发生在前一个序列点和下一个序列点之间。
关于coumpund-assignment:
E1 op= E2形式的复合赋值与简单赋值表达式E1 = E1 op (E2)的不同之处只在于左值E1只计算一次。
发布于 2014-10-17 02:56:11
让我们稍微重写一下,让它更清晰:
(*p1++) += 2
因此,p1
的旧值将被取消引用,并将2添加到其引用对象中。并且p1
将在它被解除引用之后(或者至少在它的旧值被加载并等待被解除引用之后)递增。这里没有问题:所有的片段都不会被多次使用。
话虽如此,为了清晰起见,您应该考虑重写代码:
*p1 += 2;
++p1;
发布于 2014-10-17 10:02:49
后缀增量运算符(++
)给出操作数的值,即它给出一个后缀r值。R值表示它在赋值运算符(=
)的左侧用作操作数。
int i = 0;
i++ = 0 // [Error] lvalue required as left operand of assignment
如果
*p1++ += 2;
后缀++
不适用于*p1
,但它适用于指针p1++
。这是因为后缀++
比取消引用操作符*
具有更高的优先级。因此,编译器会将上面的语句解析为
*(p1++) += 2;
这上面写的是:
在添加2
并将结果赋给它之前,必须对
*p1
进行求值(以生成变量)。要存储到*p1
的p1
之前求值。*p1
,p1
就可以随时递增。https://stackoverflow.com/questions/26417120
复制相似问题