LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1565|回复: 9

请教一个小白的问题

[复制链接]
发表于 2009-8-2 23:44:15 | 显示全部楼层 |阅读模式
照书上写了个小程序如下:

int i=8;
printf("%d\n%d\n",++i,--i);

根据书上的解释,TC的输出结果是8,7

可是我在ubuntu上的输出结果确实8,8,感觉很奇怪,请问这是什么问题阿?
谢谢。
发表于 2009-8-3 09:08:04 | 显示全部楼层
可能是gcc优化造成的结果。理论上应该是TC的结果。
mingw gcc显示的结果是8,7。
ubuntu显示的真是8,8??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-3 22:42:19 | 显示全部楼层
是的,我确认是在ubuntu下的运算结果,请看附图,一是程序文件,二是运算结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2009-8-4 09:05:08 | 显示全部楼层
难道是gcc的bug??
回复 支持 反对

使用道具 举报

发表于 2009-8-4 21:19:29 | 显示全部楼层
我考,centos5.3上也是8 8!
回复 支持 反对

使用道具 举报

发表于 2009-8-4 23:49:45 | 显示全部楼层
gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux)
8
8
回复 支持 反对

使用道具 举报

发表于 2009-8-5 09:46:13 | 显示全部楼层
记得好像哪里讲过,
任何一个C的标准没有规定函数参数的求值的顺序
完全取决于编译器的实现

因此根本原因在于上述代码的不可移植性


另外建议楼主小心手上那本书。
因为看来作者是个半路出家的专家,底子不牢靠,概念不清。
回复 支持 反对

使用道具 举报

发表于 2009-8-5 11:26:42 | 显示全部楼层
Post by 子虚乌有;2012811
记得好像哪里讲过,
任何一个C的标准没有规定函数参数的求值的顺序
完全取决于编译器的实现

因此根本原因在于上述代码的不可移植性


另外建议楼主小心手上那本书。
因为看来作者是个半路出家的专家,底子不牢靠,概念不清。

TC或者mingw gcc 3.4.5是按照参数从右往左的顺序计算值的,这点确凿。
但是gcc 4.3.x很显然不是简单的按照参数从左往右的顺序计算,如果是,那么结果应该是9 8。
但是8 8的话,如楼上所说,计算值的顺序则是并行的,没有顺序的。毕竟,没有顺序也是一种顺序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-12 01:04:24 | 显示全部楼层
我看的是谭浩强的《C程序设计》,他是用TC编译的,在TC下又是正确的,应该是和编译器有关吧。
下面这段话是我在chinaunix上得到的答案

它的++i先进栈,于是就是i=9在栈底,然后--i再入栈,就是i = 8进栈,然而在栈底的i = 9就也要变成i= 8,因为这是一个变量嘛,不可能同时有两个值。系统发现所有参数都进栈完毕后,于是两个i = 8出栈,就有这样的结果:8,8。

不知道这个对不对?
回复 支持 反对

使用道具 举报

发表于 2009-8-23 22:45:39 | 显示全部楼层
搞清楚原理,然后记住编写代码是避免让表达式结果依赖于表达式中取值的顺寻。
看看《C language book》吧,里面就清楚地表明了这一点。
有的时候真没有必要和自己钻牛角尖。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表