免费注册 查看新帖 |

Chinaunix

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

求救:一段很简单的代码,编译器不一样,结果不一样 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-17 17:13 |只看该作者 |倒序浏览
一段很很简单的代码
#include <stdio.h>

int main()
{
     int i=2;
     printf("%d,%d\n",i++,i++);
     i=2;
     printf("%d,%d\n",i++,++i);
     i=2;
     printf("%d,%d\n",++i,i++);
     i=2;
     printf("%d,%d\n",++i,++i);
     return 0;
}

VC6.0结果是:
2,2
3,3
3,2
4,3

GCC的结果是:
3,2
3,4
4,2
4,4


第一组2,2和3,2的区别是,VC6.0是在执行printf之后再执行两个i++,而GCC是在输出后面的i,之后,立刻执行了i++,所以反应到了第一参数的输出就是3,这个可以理解

第二组3,3和3,4,这个,由于printf的参数顺序是从右往左,GCC输出的结果,后面的值比前面的要大,不太理解(PS: 如果说printf在GCC参数顺序是从左往右,那第一组结果应该是2,3,而不是3,2,所以这又自相矛盾了)

第三组3,2和4,2,这个值的差别和第一组的情况类似,先执行printf和先执行i++的区别

第四组4,3和4,4,这个后面那个i的输出怎么为4,看情况,冒似和第二组的原因差不多

gcc版本:gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

哪位大大解释一下呢

论坛徽章:
0
2 [报告]
发表于 2008-11-17 17:17 |只看该作者
把时间和精力用在其它的地方才是正道

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-11-17 17:29 |只看该作者
肯定不会完全一样的。之所以不一样,就是因为编译器不一样。所以这个程序的结果依赖于编译器

论坛徽章:
0
4 [报告]
发表于 2008-11-17 17:30 |只看该作者
++i,i++在不同的编译器下运行结果就是不一样,众所周知的事实

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2008-11-17 17:36 |只看该作者
等待flw的出现。

论坛徽章:
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
6 [报告]
发表于 2008-11-17 17:51 |只看该作者

回复 #1 fanlovefan 的帖子

这种问题什么时候才能停止呢。。。 :em11: :em11: :em11:

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2008-11-17 17:53 |只看该作者
原帖由 MMMIX 于 2008-11-17 17:51 发表
这种问题什么时候才能停止呢。。。 :em11: :em11: :em11:

估计得等到编译器统一的时候

论坛徽章:
0
8 [报告]
发表于 2008-11-17 18:14 |只看该作者
原帖由 lenovo 于 2008-11-17 17:36 发表
等待flw的出现。

正解
什么时候才能结束.....................................

论坛徽章:
0
9 [报告]
发表于 2008-11-17 18:40 |只看该作者
压栈顺序不一样,  printf("%d,%d\n",i++,++i)等效于:
a = ++i;
b = a;
b++;
printf("%,%d\n",  a, b);

8048395:   c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%ebp)
804839c:   83 45 f8 01             addl   $0x1,-0x8(%ebp)
80483a0:   8b 55 f8                mov    -0x8(%ebp),%edx
80483a3:   83 45 f8 01             addl   $0x1,-0x8(%ebp)
80483a7:   8b 45 f8                mov    -0x8(%ebp),%eax
80483aa:   89 44 24 08             mov    %eax,0x8(%esp)
80483ae:   89 54 24 04             mov    %edx,0x4(%esp)

论坛徽章:
0
10 [报告]
发表于 2008-11-18 09:12 |只看该作者
原帖由 lenovo 于 2008-11-17 17:36 发表
等待flw的出现。

我也等待。


不光这个,就算看似很正常的代码。不同编译器出现不同的结果这是很正常,也很难预料的事.多遵循标准吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP