| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2185 人关注过本帖
标题:搞不懂,全是i++问题!
只看楼主 加入收藏
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
回复 9楼 李若斌
不对,用VC++运行,结果是1  0

顺境逆境切莫止境,得意失意切莫在意。
2009-11-23 12:09
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
在VC++中,要看||与|的区别,如果是||的话如果前半真的话,就不执行后半的了,如果是假的话,才执行后半的

顺境逆境切莫止境,得意失意切莫在意。
2009-11-23 12:27
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
3.#include<stdio.h>
main()
{
   int i=1;
   printf("%d  %d",++i,i++);
}
这道用VC++运行,输出的是2  1,不是3  1

顺境逆境切莫止境,得意失意切莫在意。
2009-11-23 12:35
iaamjerry
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-11-3
收藏
得分:0 
(I)
#include<stdio.h>
main()
{
   int i=1,z;
   z=i--||++i;
   printf("%d  %d",z,i);
}
运算结果1 0
(II)
#include<stdio.h>
main()
{
   int i=1,z;
   z=i--&&++i;
   printf("%d  %d",z,i);
}
运算结果1 1
上面(I)(II)两个的差别就是将逻辑或||改成了逻辑与&&,其他未改变,按理说不影响i的输出结果,但是结果却是输出i的值不一致。
另外,如果改成
(III)
#include<stdio.h>
main()
{
   int i=1,z,x,y;
   x=i--;
   y=++i;
   z=x||y;
   printf("%d%d%d%d",x,y,z,i);
}
输出结果变成了1111,即此时z=1,i=1,(III)中只是将(I)中的i--,++i做了变量代换,换成了x和y,而i的结果却由0变成了1,实在令我无法解释,还请高手赐教。

2009-11-23 13:46
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:5 
以下是引用iaamjerry在2009-11-23 13:46:16的发言:

(I)
#include<stdio.h>
main()
{
   int i=1,z;
   z=i--||++i;
   printf("%d  %d",z,i);
}
运算结果1 0
(II)
#include<stdio.h>
main()
{
   int i=1,z;
   z=i--&&++i;
   printf("%d  %d",z,i);
}
运算结果1 ...
z=i--&&++i;
这句i--等于1(这时虽然i--为1,但是实际原来的对象i已经为0了,参考C++对“++”运算符的重载知,i--反回的是暂时对象,这个暂时对象是从原对象复制过来的,而暂时对象复制完原对象后,原对象才进行减一保存,代下次用),所以还要继续计算右边的,而右边的++i等于0+1==1(些处的i为原对象等于0,相当于int i=0;++i;一样),而z=1||1==1  。所以输出:1  1

顺境逆境切莫止境,得意失意切莫在意。
2009-11-23 14:09
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
(III)
#include<stdio.h>
main()
{
   int i=1,z,x,y;
   x=i--;
   y=++i;
   z=x||y;
   printf("%d%d%d%d",x,y,z,i);
}

这个也是用同样的道理分析,得出的结果为:1111

顺境逆境切莫止境,得意失意切莫在意。
2009-11-23 14:12
iaamjerry
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-11-3
收藏
得分:0 
回复 16楼 无诲今生
谢谢,不过你没有看懂我要问的意思,麻烦你再仔细看一下我的疑问。
2009-11-24 00:46
越月
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2009-11-22
收藏
得分:0 
首先先谢谢各位,我有一点想问的是:
像第一题中的:   z=--i||i++;      它是哪里先运算的啊,
--i是先减1再取值,i++是先取值再减1,这大家都知道的
我说一下我的疑问吧、
我先写一个小程序:
   #include<stdio.h>
   main()
   {
      int a,b=100,c=1000;
      a=b||c;
      printf("a=%d",a);
   }
由这个程序运行结果为 a=1,可以清楚地知道,因为"b||c"的逻辑正确(不管把b,c改成多少),所以"b||c"的结果为 1,然后把1赋值给a,这样运算也符合书本上的运算优先级,先 || 再 =
照这个道理,第一第二题中的 z 应该是 1 才对啊!结果不是,为什么啊!!!????????
从哪里运算先啊!运算的过程谁能解释清楚吗?、
下面二题呢?过程???
还是不明白啊!!!
有没有人能没有矛盾地、合理地、系统地回答啊,
不要牵强的凑成答案给我
谢谢!
2009-11-24 19:24
blueskystadi
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2009-11-24
收藏
得分:0 
printf("%d  %d",++i,i++); 这个和编译器有关系,有的编译器是从左向右,有的从右向左。
2009-11-24 21:36
lll1894
Rank: 2
等 级:论坛游民
帖 子:5
专家分:26
注 册:2008-7-20
收藏
得分:5 
下面说说我的理解,希望大家多多指正。
运算结果与编译器有关,在vc6.0中,自增自减的运行步骤是不一样的:
++i:先自增,再使用;
i++:先使用再自增,Vc中要在整条语句使用完了再自增!!!

1.
#include<stdio.h>
main()
{
   int i=1,z;
   z=--i||i++;
   printf("%d  %d",z,i);
}

输出结果:0,1.
说明:=--i||i++从左到右执行,--i=0,i=0;i++=0,i=1;
2.
#include<stdio.h>
main()
{
   int i=1,z;
   z=i--||i++;
   printf("%d  %d",z,i);
}

输出结果:1,0.
说明:i--||i++从左到右执行,i--=1,所有z=1,后部分i++不执行,i=0.

3.#include<stdio.h>
main()
{
   int i=1;
   printf("%d  %d",++i,i++);
}
输出结果:3,1.
说明:printf函数执行顺序为从右到左,先执行i++,输出1,i=2;再执行++i=3,i=3.

4.(这道别人在论坛已经问过,但我还是不理解)
#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
说明:vc中i++先使用,最后整条语句运行完了之后自增;
          ++i先自增然后使用。
      所以:p=(i++)+(i++)+(i++)=5+5+5=15,语句运行之后自增,i=8;
            q值为什么为22,我也不懂,我认为q=6+7+8=21???
2009-11-25 11:01
快速回复:搞不懂,全是i++问题!
数据加载中...
 
   



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

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