| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 512 人关注过本帖
标题:请教大家个问题
只看楼主 加入收藏
skywalker_
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2010-1-24
结帖率:100%
收藏
已结贴  问题点数:2 回复次数:2 
请教大家个问题
a+b*c,编译器扫描到+后继续扫描,碰到*,因为*优先级高,所以先执行*后执行+.
c=i++,编译器扫描到=后继续扫描,碰到++,++优先权高,所以该先执行++再赋值。
然而书上还说该式是先赋值后自增的,i++是后自增,实际运行结果也说明赋值后才自增的。
这不是矛盾了吗?
期待高人,这个问题问了100个人了,没一个完美的解释。
搜索更多相关主题的帖子: 完美 编译器 优先级 优先权 
2010-01-28 18:10
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:2 
问了一100个人了,问题点数才2?

这是表达式求值的问题,只要概念过关的话,是很好答的。

c = i++
按照表达式的优先级,后缀超高,明显要先算后缀表达式的值,再进行赋值。
上面那个代码等价于:
c = (i++)
后面的表达式先求值。这个表达式的值是多少?就是 i 未自增前的值。这个值求完了,赋给 c 就行了。
不过这之后,i 还要自增一下。

C 标准没说这个 i 的值应该什么时候自增。也可能求完值就自增了,但这不影响这个表达式的值(还是 i 原来的值)。也可能是赋完值才自增,反正这也不影响表达式的值。当然也可以先自增,再求值,不能说这是错误,只不过只时候再求值时显得很别扭。

这种与计算表达式无关的行为就是副作用。C 标准没有规定这些效果应该怎么实现。但再这个语句执行之前,副作用应该没有产生,下个语句执行前副作用应该全部执行完毕。编译器可以用任何合理的方式实现,并且无需在文档中声明。(这实现方式,专业一点的说法叫 未定义)


[ 本帖最后由 pangding 于 2010-1-28 23:16 编辑 ]
2010-01-28 23:14
skywalker_
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2010-1-24
收藏
得分:0 
好,你的解释很合理。总之好多人不能解释,我分只有13分了,给少了,不好意思啊
2010-01-29 14:24
快速回复:请教大家个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038543 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved