关于++(post-increment operator)的语义

sandrowjw 2003-09-14 07:17:59
经常看到谈论这个东西的帖子,公司面试也经常会考相关的内容,我们的书上说后缀++在everything发生之后发生,意思实际上就是说++的作用域是statement。但是很多情况下在编译器上并不是这样,比如常见的:++表达式作为函数参数,连用的++表达式。这到底是标准上没有规定,还是编译器没有遵照标准?
这样就有一道选择题可以做:
后缀++表达式在下面那个语法单位运算完成后再进行运算?
1、statement;
2、真包含后缀表达式的最小的expression;
3、未定义
4、其他看法
...全文
193 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandrowjw 2003-09-14
  • 打赏
  • 举报
回复
我想我知道怎么回事了,编译器对于内建的类型做了比较特殊的处理,用户在某些情况下无法模拟这种处理的。也就是说对于内建的类型是真正实现了statement结束以后再进行自增运算,而用户的处理则是完全按照用户定义的语义的(所以不太可信)。
谢谢楼上,认识又加深了。
pengzhenwanli 2003-09-14
  • 打赏
  • 举报
回复
经常看到谈论这个东西的帖子,公司面试也经常会考相关的内容,我们的书上说后缀++在everything发生之后发生,意思实际上就是说++的作用域是statement。但是很多情况下在编译器上并不是这样,比如常见的:++表达式作为函数参数,连用的++表达式。这到底是标准上没有规定,还是编译器没有遵照标准?
这个是标准没有规定,依赖于具体的编译器实现。
这样就有一道选择题可以做:
后缀++表达式在下面那个语法单位运算完成后再进行运算?
1、statement;
2、真包含后缀表达式的最小的expression;
3、未定义
4、其他看法
我选择其他看法。
你应该重载过++运算符,你说你是怎样实现的?
你可以有多种实现方法,也可以完全改变语意。但是不推荐改变语意。
应该是把原来的对象保存一下,再改变,然后在返回对象。
aflyinghorse 2003-09-14
  • 打赏
  • 举报
回复
应根据运算符的优先级和结合性来考虑
如*p++就是*(p++),而不是(*p)++

x++相当于(t=x,++x,t),即x++得到的使x未被加1的值

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧