i++ + i++的意义

yqj2065 2013-02-19 12:17:38
看了“[置顶] [推荐] C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]”帖子,也说两句。

1、这个东西,教师需不需要讲?很多跟帖说“讨厌这些毫无意义的东西”。这是一个误解。当你的老师讲解这些东西时,当用人单位考这个东西时,他们希望你知道:在C/C++ 语言中,由于没有规定上述表达式的求值顺序,因而你不得写那些代码——而不是相反。

2、如果问你语法和语义的区别, i++ + i++就是一个很好的例子。应该没有人说“语法和语义的区别”毫无意义吧。

3、i++ + i++这个东西无定义,意味着编译器可以自由的处理。因而此时“迷信编译器、调试器、运行结果”都是错误的认识。你无法穷尽所有的编译器、调试器以保证你的语意正确执行。

4、副作用是一个重要而又常用的概念。不要倒洗澡水把澡盆中的小孩子也泼了。
5、该帖子的核心在最后。
这里讨论的是语言,而不是某个实现...后记:去年参加一个学术会议,看到有同行写文章讨论某个C系统里表达式究竟按什么顺序求值,并总结出一些“规律”。从讨论中了解到某“程序员水平考试”出了这类题目。这使我感到很不安...发现许多专业课教师也对这一基本问题也不甚明了,更觉得问题确实严重。
后后记:4年多过去了,许多新的和老的教科书仍然在不厌其烦地讨论在C语言里原本并无意义的问题(如本文所指出的)。希望学习和使用C语言的人不要陷入其中。
...全文
3650 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeweiouyang 2013-04-10
  • 打赏
  • 举报
回复
老师用心良苦啊
wzb56 2013-03-01
  • 打赏
  • 举报
回复
garfold 2013-02-25
  • 打赏
  • 举报
回复
其实 C++ Primer Plus(第六版)中文版 中对这个有说明的
wlmouse 2013-02-25
  • 打赏
  • 举报
回复
引用 39 楼 zhao4zhong1 的回复:
自己写代码搞不清楚算符优先级请多加括号。 看别人代码搞不清楚算符优先级能调试的话请单步调试对应汇编。 看别人代码搞不清楚算符优先级不能调试的话想办法照写一小段孤立的可调试的代码然后单步调试对应汇编。 看别人代码搞不清楚算符优先级不能调试的话且没有办法照写一小段孤立的可调试的代码然后单步调试对应汇编的话只能参考算符优先级表猜了(提醒:并不能100%猜对)。
和优先级无关,这是语言标准未定义的操作。不同的编译器不同的版本结果不保证一致。
wlmouse 2013-02-25
  • 打赏
  • 举报
回复
这个问题从C语言时代就有了,是未定义操作。无论编译器无论如何解释都可以认为没错。 这种语句执行的结果只能对应当前编译器的当前版本,换了一个编译器或者版本就可能变成另一个数。国内很多脑残教材在这类语句上面没少纠缠。
hexi 2013-02-25
  • 打赏
  • 举报
回复
误人子弟的代码。 有毛病的人才会在代码里些这样的语句。
okmime 2013-02-23
  • 打赏
  • 举报
回复
给自己挖坑,给别人挖坑
赵4老师 2013-02-23
  • 打赏
  • 举报
回复
自己写代码搞不清楚算符优先级请多加括号。 看别人代码搞不清楚算符优先级能调试的话请单步调试对应汇编。 看别人代码搞不清楚算符优先级不能调试的话想办法照写一小段孤立的可调试的代码然后单步调试对应汇编。 看别人代码搞不清楚算符优先级不能调试的话且没有办法照写一小段孤立的可调试的代码然后单步调试对应汇编的话只能参考算符优先级表猜了(提醒:并不能100%猜对)。
zhkza99c 2013-02-22
  • 打赏
  • 举报
回复
引用 35 楼 sophistcxf 的回复:
但若有公司提出真的出此问呢?
不犹豫,骂他
kilior 2013-02-22
  • 打赏
  • 举报
回复
研究这个真的没必要,加个括号就明确的东西,有必要浪费那么时间去研究。 有个bt的公司,编程规范严禁这么写,但每次内部技术考试又喜欢考这个。。。。
sophistcxf 2013-02-21
  • 打赏
  • 举报
回复
但若有公司提出真的出此问呢?
麻浦区保安 2013-02-21
  • 打赏
  • 举报
回复
加括弧解决!别偷懒
dy200811 2013-02-21
  • 打赏
  • 举报
回复
考试用的规律,很多真没用,自己也不会创新,学了只能一辈子打工
cjoooooo 2013-02-21
  • 打赏
  • 举报
回复
敲代码去。闲的蛋疼!
赵4老师 2013-02-20
  • 打赏
  • 举报
回复
可以说从来就没有什么“客观事实”,只有“眼前的事实”。 参考《骇客帝国》
quickily 2013-02-20
  • 打赏
  • 举报
回复
i++,先试用,后自加, ++i,先自加,再试用, 呵呵
hping1016 2013-02-20
  • 打赏
  • 举报
回复
这里要注意。。。。
zgz1992319 2013-02-20
  • 打赏
  • 举报
回复
原来如此 。。。
yqj2065 2013-02-20
  • 打赏
  • 举报
回复
引用 29 楼 billzheng 的回复:
It's undefined behavior because C++ standard doesn't describe a way to do it. And it works on all c++ compiler, so it's just compiler implementation behavior.
我认为老师应该以i++ + i++为例子,将这段引用的文字告诉学生。同时强调“副作用”这个概念。
billzheng 2013-02-20
  • 打赏
  • 举报
回复
It's undefined behavior because C++ standard doesn't describe a way to do it. And it works on all c++ compiler, so it's just compiler implementation behavior.
加载更多回复(23)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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