>第 16 章 运算符详解>Side Effect与Sequence Point

notusingpc not.using.pc@gmail.com
2002-04-06 12:20:16

gcc果断报错
a[i++] = i;


a.c: 在函数‘main’中:
a.c:9:5: 警告: ‘i’上的运算结果可能是未定义的 [-Wsequence-point]


稀饭 m@xifan.us
2002-05-29 10:37:43

楼上以及楼上上:
a[i++] = i;
这条语句可以有以下两种执行方式:
方式1:
temp=i;
a[temp]= i
i=i+1;

方式2:
temp=i;
i=i+1;
a[temp]=i;

没有标准指定说i=i+1这步必须放在最后执行.


mick huimin47@gmail.com
2009-07-22 23:17:52

第二点的第二个方框下面这行
”这个控制表达式的求值顺序是:先求scanf("%d", &man) = 1的值“   中应该是 “!=” 而不是 “=” 吧?


宋劲杉 songjinshan@akaedu.org
2009-07-23 17:02:04

谢谢指出!


尹志伟 zhiweiyin1985@gmail.com
2009-08-23 10:51:47

关于您本节中“解释各种Sequence Point”的部分,我还有疑问,请您指教
1、foo(f(), g())例子中,f()和g()的执行顺序是未知的,但是一定是先把这两个执行完,再做foo()的啊。而您说“foo、f()、g()这三个表达式哪个先求值哪个后求值是Unspecified”,这里是不是笔误了?
2、在逻辑与或的讲解部分,您提到了两个操作数时求值的顺序总是先求第一个(也就是我们常说的短路表达式的用法),那么存在2个以上的操作数时,也是从左向右依次进行的吧?原因是因为||和&&的结合性是自左向右的,不知道这样理解对不对?
请您指教~


yolila yolila@live.cn
2009-12-26 15:32:49

老师您好,在讨论组上看到有人提到sequence points所以搜索到这儿来。对于表达式 a = (++a)+(++a)+(++a)+(++a); 初看,感觉不管哪个++a先执行,最后a的结果应该都是15的。++a肯定只能执行4次对吧。原文中“a的值被加过几次了,这些都不确定”是不妥的对吧。

另外,我分别在VSTS 2008和gcc 4.2.4上编译运行了一下,输出的结果分别为20和15,查看了VSTS编译出的debug版的汇编代码,发现是先执行完所有的++a,最后a = 5 + 5 + 5 + 5得出结果。感觉VSTS这样做不靠谱,因为它没有评估子表达式的值。

此致
敬礼


宋劲杉 songjinshan@akaedu.org
2009-12-27 15:03:06

关于这些问题,在本书的正式出版的版本中解释得更详细一些,请参考出版的版本。本站这个版本只是draft,有些地方说得还不够细。我暂时不做过多解释了,日后出版的版本会在本站公开的。


李红波 youye0528@126.com
2011-02-22 10:11:37

a[i++] = i;
这个歧义并不大,应该是先读i的值,然后再++
可以拆分为a[i]=i;i++;
书写的很好,不过有些错误的地方


蒋广杰 bigtree1127@163.com
2011-11-17 15:00:24

同意楼上,a[i++] = i;这条语句在什么平台上都没有歧义吧


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!