首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >*p++ += 2是否定义良好?

*p++ += 2是否定义良好?
EN

Stack Overflow用户
提问于 2014-10-17 10:49:45
回答 2查看 1.3K关注 0票数 16

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

代码语言:javascript
运行
复制
*p1++ += 2;

或其他类似的声明:

代码语言:javascript
运行
复制
*E1++ <operator>= E2

从标准C到后增量:

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

关于coumpund-assignment:

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

EN

回答 2

Stack Overflow用户

发布于 2014-10-17 10:56:11

让我们稍微重写一下,让它更清晰:

代码语言:javascript
运行
复制
(*p1++) += 2

因此,p1的旧值将被取消引用,并将2添加到其引用对象中。并且p1将在它被解除引用之后(或者至少在它的旧值被加载并等待被解除引用之后)递增。这里没有问题:所有的片段都不会被多次使用。

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

代码语言:javascript
运行
复制
*p1 += 2;
++p1;
票数 23
EN

Stack Overflow用户

发布于 2014-10-17 18:02:49

后缀增量运算符(++)给出操作数的值,即它给出一个后缀r值。R值表示它在赋值运算符(=)的左侧用作操作数。

代码语言:javascript
运行
复制
int i = 0;
i++ = 0   // [Error] lvalue required as left operand of assignment  

如果

代码语言:javascript
运行
复制
*p1++ += 2;  

后缀++不适用于*p1,但它适用于指针p1++。这是因为后缀++比取消引用操作符*具有更高的优先级。因此,编译器会将上面的语句解析为

代码语言:javascript
运行
复制
*(p1++) += 2;

这上面写的是:

在添加2并将结果赋给它之前,必须对

  • *p1进行求值(以生成变量)。要存储到*p1
  • 结果必须在递增到p1之前求值。
  • 一旦评估了*p1p1就可以随时递增。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26417120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档