免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8830 | 回复: 56
打印 上一主题 下一主题

这句话是什么意思? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-26 18:39 来自手机 |只看该作者 |倒序浏览
本帖最后由 GAZAG 于 2011-12-26 21:53 编辑

《C语言核心手册》第五章 表达式和运算符
副作用和序列点


在两个连续的序列点之间,可以用任何次序作局部的计算。作为一名程序员,你必须特别小心,不要在两个连续的序列点之间多次修改任何对象。

int  i=1;
i=i++;

因为在第二条语句中,赋值和递增的运算可能会以任何次序进行,i的结果值无法估计。

问题:
(1)什么是局部的计算?

论坛徽章:
0
2 [报告]
发表于 2011-12-27 09:44 |只看该作者
这种问题就不要问了,本来这本书就是别人翻译的,别人翻译的有没有问题都不知道,不必深究语言,如果那过知识点没有学到可以找别的书看,知识都是相通的。有句话说的好:尽信书不如无书。

论坛徽章:
0
3 [报告]
发表于 2011-12-27 11:12 |只看该作者
2楼:
   可否翻译下这句话的原文(英文)?

论坛徽章:
0
4 [报告]
发表于 2011-12-27 11:26 |只看该作者
回复 1# GAZAG


   局部就是指在两个连续的序点之间

论坛徽章:
0
5 [报告]
发表于 2011-12-27 11:29 |只看该作者
本帖最后由 GAZAG 于 2011-12-27 12:17 编辑

i=i++;
这句表达式语句,可以用任何次序作局部的计算。
(1)i++  
(2)i=i
或者
(1)i=i
(2)i++  
对不对?

论坛徽章:
0
6 [报告]
发表于 2011-12-27 12:11 |只看该作者
如果一个表达式语句,可以用任何次序计算子表达式。那么,表达式的优先级还有什么意义?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2011-12-27 12:37 |只看该作者
GAZAG 发表于 2011-12-27 12:11
如果一个表达式语句,可以用任何次序计算子表达式。那么,表达式的优先级还有什么意义?


没有“表达式的优先级”这么一说。

论坛徽章:
0
8 [报告]
发表于 2011-12-27 13:10 |只看该作者
GAZAG 发表于 2011-12-27 12:11
如果一个表达式语句,可以用任何次序计算子表达式。那么,表达式的优先级还有什么意义?


优先级不是计算顺序
结合顺序也不是计算顺序
根本没有计算顺序
所以才要标准

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2011-12-27 13:12 |只看该作者
回复 1# GAZAG


    这个就属于 C 的 dark corners,知道这快有问题,写代码的时候避免就行了。再深究,如果你不准备实现 C 编译器,那基本就属于浪费时间。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
10 [报告]
发表于 2011-12-27 13:29 |只看该作者
回复 6# GAZAG


可以看成求值的顺序。比如func(i++, i+1),先要eval参数。于是要eval i++与i+1,但标准没有规定参数以什么顺序eval。如果所有的表达式都没有副作用,即eval它后不会影响eval其它表达式的結果,那顺序也就无所谓了。如果表达式有副作用,比如eval i++会对eval i+1产生影响,那么eval顺序就要紧了。eval两个顺序点之间的表达式时,表达式的副作用在何時会生效不得而知。而经过一个顺序点,eval后面的表达式时一定可以看到eval顺序点之前表达产生的副作用,如果有的话。

当然,最简单的解释是“求值顺序的不确定”。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP