| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1294 人关注过本帖
标题:求教一个关于i++的问题
只看楼主 加入收藏
burningbebe
Rank: 2
等 级:论坛游民
帖 子:41
专家分:19
注 册:2009-10-31
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:14 
求教一个关于i++的问题
#include <stdio.h>
main()
{
    int i=5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+(++j)+(++j);
    printf("%d,%d,%d,%d",p,i,q,j)
}
各位朋友 能告诉我 这个答案是多少吗
我的编译器得出来的是 15,8,22,8。
可是书上的理论值是15,8,24,8。
我用的编译器是gcc 这是怎么回事啊
他的计算原理是什么  
                        ——— —个菜鸟
搜索更多相关主题的帖子: 编译器 朋友 
2009-11-17 14:36
lhl198989
Rank: 2
等 级:论坛游民
帖 子:16
专家分:67
注 册:2009-9-12
收藏
得分:10 
回复帖:   像p=i++ + i++ + i++这种语句的实现是依赖于具体的编译器实现的,因为这是C标准所明确定义为非法的例子。标准的原话是:“在上一个和下一个序列点之间,一个对象所保存果的值至多只能被表达式的求值修改一次。而且只有在确定将要保存的值的时候才能访问前一个值。”
    这两句化的意思是,在一个表达式中,一个变量只能被修改一次,像i=i++这样的语句是非法的。而且标准还禁止了像a[i]=i++这样在同一个表达式中边引用边修改的语句。但是在具体的编译器中,这样的语句可能合法,而且能够通过编译,但是得到的结果可能和我们预料的有很大区别,所以像这样非法的语句,我的建议是尽量不要用,除非你想深入观察你的编译器的具体实现。所以上面两种答案都对,最后,如果你的C语言教材没能指出这种用法的错误,那么我再联系你尽快换一本好点的教科书。
2009-11-17 16:57
yinfuyong
Rank: 2
等 级:论坛游民
帖 子:35
专家分:45
注 册:2009-10-31
收藏
得分:0 
这种问题比较闹心,其实就那么回事,明明不是自己的问题,lz相信自己
2009-11-17 20:28
hyfl
Rank: 7Rank: 7Rank: 7
来 自:火星
等 级:黑侠
帖 子:113
专家分:552
注 册:2008-11-20
收藏
得分:0 
yun

“一切高手都是从菜鸟炼成的!”1099285180@
2009-11-20 01:40
silent325
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-11-15
收藏
得分:0 
原来是这样的,学习了!
2009-11-22 00:31
zdhppl
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-11-7
收藏
得分:0 
哦 谢谢 楼主和2楼的 我也有这种类似的疑问~ ~
像楼主给的 这段程序
我运行就有错误

#include <stdio.h>
main()
{
    int i=5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+(++j)+(++j);
    printf("%d,%d,%d,%d",p,i,q,j)
}



s.obj - 1 error(s), 0 warning(s)


2009-11-22 10:24
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
简单的来说:
a+b+c的求值过程中,只规定了:要先求前面加号的值再求后面加号。
可是没有规定,是先求a的值还是b或者c的。
这样的行为是未定义的。



要练习算法就来http:///!!有挑战哦!!
2009-11-22 10:41
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:0 
#include <stdio.h>
void main()
{
    int i=5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+((++j)+(++j));
    printf("%d,%d,%d,%d",p,i,q,j);
}
这个结果才是15,8,24,8.也就是说q的运算先后问题,LZ的程序q=(7+7)+8,先计算(++j)+(++j)然后再第三个++j

www.
2009-11-22 10:49
xiefeng122
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:126
专家分:139
注 册:2009-4-1
收藏
得分:0 
回复 2楼 lhl198989
恩··受教了
2009-11-22 10:53
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:0 
不同的编译器还是有很大区别的,不同的教材也是根据不同的编译器而写的

www.
2009-11-22 10:53
快速回复:求教一个关于i++的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036123 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved