gcc果断报错 a[i++] = i; a.c: 在函数‘main’中: a.c:9:5: 警告: ‘i’上的运算结果可能是未定义的 [-Wsequence-point]
楼上以及楼上上: a[i++] = i; 这条语句可以有以下两种执行方式: 方式1: temp=i; a[temp]= i i=i+1; 方式2: temp=i; i=i+1; a[temp]=i; 没有标准指定说i=i+1这步必须放在最后执行.
第二点的第二个方框下面这行 ”这个控制表达式的求值顺序是:先求scanf("%d", &man) = 1的值“ 中应该是 “!=” 而不是 “=” 吧?
谢谢指出!
关于您本节中“解释各种Sequence Point”的部分,我还有疑问,请您指教 1、foo(f(), g())例子中,f()和g()的执行顺序是未知的,但是一定是先把这两个执行完,再做foo()的啊。而您说“foo、f()、g()这三个表达式哪个先求值哪个后求值是Unspecified”,这里是不是笔误了? 2、在逻辑与或的讲解部分,您提到了两个操作数时求值的顺序总是先求第一个(也就是我们常说的短路表达式的用法),那么存在2个以上的操作数时,也是从左向右依次进行的吧?原因是因为||和&&的结合性是自左向右的,不知道这样理解对不对? 请您指教~
老师您好,在讨论组上看到有人提到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这样做不靠谱,因为它没有评估子表达式的值。 此致 敬礼
关于这些问题,在本书的正式出版的版本中解释得更详细一些,请参考出版的版本。本站这个版本只是draft,有些地方说得还不够细。我暂时不做过多解释了,日后出版的版本会在本站公开的。
a[i++] = i; 这个歧义并不大,应该是先读i的值,然后再++ 可以拆分为a[i]=i;i++; 书写的很好,不过有些错误的地方
同意楼上,a[i++] = i;这条语句在什么平台上都没有歧义吧
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!