免费注册 查看新帖 |

Chinaunix

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

[C] i++与++i问题 [复制链接]

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-01 21:52 |只看该作者 |正序浏览
在看 谭浩强的C语言,基中有个这样的例子.如t9.c

这个程序中,对P=(i++)+(i++)+(i++)应理解为三个i相加,故P值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q 的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。

可实际中q的值怎么会变成22了呢??(环境为rhel 4u7,gcc version 3.4.6 20060404 (Red Hat 3.4.6-10) )

[root@rhel47 test]# more t9.c
#include <math.h>
main()
{
    int i=5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+(++j)+(++j);
    printf("%d,%d,%d,%d\n",p,q,i,j);
}
[root@rhel47 test]# cc -o t9 t9.c
[root@rhel47 test]# ./t9
15,22,8,8

论坛徽章:
0
46 [报告]
发表于 2008-10-10 21:31 |只看该作者
老师们就爱考这个 烦死了

论坛徽章:
0
45 [报告]
发表于 2008-10-09 19:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
44 [报告]
发表于 2008-10-08 21:07 |只看该作者
哎,我从来都是拆分成两句的....

论坛徽章:
0
43 [报告]
发表于 2008-10-07 17:28 |只看该作者
C++Primer中有,副作用与序列点

论坛徽章:
0
42 [报告]
发表于 2008-10-07 16:56 |只看该作者
LZ专牛角尖了

论坛徽章:
0
41 [报告]
发表于 2008-10-07 16:51 |只看该作者
我觉得这是和编译器有关系的,没有必要太较真这种东西,实际的代码不会这样写的。

论坛徽章:
0
40 [报告]
发表于 2008-10-07 09:18 |只看该作者
原帖由 kiffa 于 2008-10-5 17:55 发表
还是觉得奇怪。
i = 5;
j = (i++) + (i++) + (i++);
不妨等价为j = a + b + c;

最开始我的想法是:虽然操作数的计算顺序未定,但就这个表达式而言,其结果应该是一定的,和操作数的计算顺序无关。

假 ...


两个字:有为。
有的时候还是无为一点好。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
39 [报告]
发表于 2008-10-07 08:55 |只看该作者
这问题讨论过 N 次了。

论坛徽章:
0
38 [报告]
发表于 2008-10-06 23:35 |只看该作者
这是个烂问题。没有标准答案。
而且如果你在产品中写出这样的程序,小心老板炒了你。
因为不同的编译器的实现是不固定的,因为c标准没有规定计算的顺序,
他只规定了sequence point。
c标准允许不同的厂商有不同的实现。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP