免费注册 查看新帖 |

Chinaunix

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

[C] 关于函数入参顺序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-03 17:32 |只看该作者 |倒序浏览
无意中在网上看到一个问题:
int i = 9;
printf("%d %d %d\n", ++i, i, --i);

输出结果是:
9 9 9


很疑惑,为什么不是9 8 8?

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
2 [报告]
发表于 2013-05-03 19:50 |只看该作者
c和c++中有sequence-point的概念,在两个sequence-point点之间多次修改同一个变量会导致未定义的行为。
分号就是一种sequence-point,printf语句中的两次修改i就处于同样sequence-point之间,所以结果是未定义的。

printf("%d %d %d\n", ++i, i, --i);之所以会产生“9 9 9”的结果,可能是因为前缀“++”或“--”相当于C++中返回i的引用,
编译器可能在计算完所有的参数后,才将参数复制到printf的实参位置,结果“++i”、“i”和“--i”都是从i的地址取i的最终结果传给printf。

如果将"++i"和"--i"改为“i++"和"i--",这个问题就没有了,因为后缀"++"和"--"必定会产生临时变量返回。但是中间的i的值还是有问题的,
它应当是最终的i值。

如果将"int i;"改为"volatile int i;"应该是没有问题的了。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2013-05-03 20:21 |只看该作者
这个结果不一定,跟编译器有关

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2013-05-04 15:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
5 [报告]
发表于 2013-05-04 17:51 |只看该作者
请教楼主问什么是9 8 8, 我改成了volatile,结果确实是9 8 8。

回复 1# luoops


   

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
6 [报告]
发表于 2013-05-06 15:10 |只看该作者
回复 4# pmerofc

你的赞同包不包括

如果将"int i;"改为"volatile int i;"应该是没有问题的了。

这句

加volatile 就没问题了吗
   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
7 [报告]
发表于 2013-05-06 16:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2013-05-06 16:39 |只看该作者
这种扯淡的东西还是别研究了。

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
9 [报告]
发表于 2013-05-06 19:44 |只看该作者
回复 6# lin5161678
volatile只是保证传给printf的i参数使用计算它的时候的值,而不是被别的改变后的最终值。
它不能保证"++i", i 和 "--i"的计算顺序。


   

论坛徽章:
0
10 [报告]
发表于 2013-05-06 21:12 |只看该作者
回复 9# 井蛙夏虫

C语言为了保证数目不定的参数功能,应该要求参数都是从右至左入栈吧?
所以计算顺序应该的固定的吧!

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP