发新话题
打印

我在Xplore上和人讨论的帖子,非常非常有学习价值!

我在Xplore上和人讨论的帖子,非常非常有学习价值!

我在Xplore上和人讨论的帖子,非常非常有学习价值!



512TCT
高级会员


注册日期: 2003年12月23日
发贴数量: 34
所在位置: 湘潭大学
发表时间: 2004年03月25日 20:57 贴子标题: [求助]奇怪的“不死”循环!——它怎么会“活”呢?

小弟在书上遇到这么一道推断题用的TC)
#include
main()
{
int s=0,i=1,j=10;
while(i--&&j--,s+=2,j++<15); /*这里的的确确有分号*/
printf("%d\n",i+j+s);
return 0;
}
问结果会是什么,我推断该无限地循环下去,而且什么也输不出来。
我的思路如下:

第一次循环结束:i=0,j=10,s=2 其中:i开始时是1,所以要计算j,则i,j都减1(i=0,j=9),s加2后(s=2),先拿j与15比,结果9<15成立,则还要进行循环,同时j加1变回10。

第二次循环结束:i=-1,j=11,s=4 其中:i开始时是0,所以不再计算j,则只有i减1,j不变(i=-1,j=10),s加2后(s=4),先拿j与15比,结果10<15成立,则还要进行循环,同时j加1变成11。

第三次循环结束:i=-2,j=11,s=6
第四次循环结束:i=-3,j=11,s=8
…………
……
(往后,i每次减1,j不变,s每次加2)

所以,我得出答案:这是一个死循环,而且无法输出任何结果。
但是 ,上机一试,它没有“死”,还“活”得好好的呢,输出结果是19

我着实想不通,就想看看他最后的i,j,s各为多少,就把它改了这样:
#include
main()
{
int s=0,i=1,j=10;
while(i--&&j--,s+=2,j++<15);
printf("i=%d j=%d s=%d\n",i,j,s);
return 0;
}
结果得到i=-1,j=16,s=4
j=16吗?
怪哉!它是怎么跳变到16去的?
为了搞清楚它的变化过程,我又把程序改成这样:
#include
main()
{
int s=0,i=1,j=10;
while(i--&&j--,s+=2,j++<15) printf("i=%d j=%d s=%d \n",i,j,s);
printf("%d\n",i+j+s);
return 0;
}

结果它如我所料地——“死”了!一直循环了下去,不断地输出结果……

这到底是怎么回事?为什么仅仅改了一下循环体,它就有这么大的变化?
为什么用“;”作循环体会发生跳变?

求助各位高手及老师!
谢谢!!!
_________________
Good good study,day day up!

返回顶部


mlsx
超级管理员


注册日期: 2003年12月20日
发贴数量: 600
所在位置: 湘潭大学
发表时间: 2004年03月26日 08:59 贴子标题: 我的过程!

--------------------------------------------------------------------------------

刚看到你的帖子!
我首先输入你的第一个程序,编译,运行,结果和你说的一样:死循环,什么也不会输出,但是我用的室C语言的老家---UNIX系统,而你使用的是windows平台吧,这样就和编译器有关系!
把后面的程序我也再unix平台编译了一次,得到的结果和你推测的一样,所以我想不是你的问题,而是系统编译器的问题,你可以再unix平台测试一下,为了怕我写错,我把写的程序贴出来
%cat test.c
代码::

#include
main()
{
int s=0,i=1,j=10;
while(i--&&j--,s+=2,j++<15);
printf("i=%d,j=%d,s=%d",i,j,s);
return 0;
}


_________________
女友对我说:“如果秋天过去了,我会在雪地爱你,如果世界消失了,我会在天堂爱你,如果你消失了,我会在泪水中爱你,如果我消失了,我会在心中爱你!”


返回顶部


512TCT
高级会员


注册日期: 2003年12月23日
发贴数量: 34
所在位置: 湘潭大学
发表时间: 2004年03月26日 10:36 贴子标题:

--------------------------------------------------------------------------------

4242

我就是在Windows下用的

unix我至今还不会用,上次在计算机系机房上机,我想见识一下unix是什么样的,结果进去以后要我输入名字和密码!结果没进成

谢谢回答。
_________________
Good good study,day day up!
我被捕了。 第一天敌人用富贵引诱我,我没招; 第二天敌人严刑拷打我,我也没招; 第三天敌人送了一个美女给我,我招了; 第四天我还想招,敌人把我杀了!!! My HomePage:www.cstc.net.cn My Blog :www.cnblogs.com/monkeyking Call me at: 29743836

TOP

re:>>1>while循环里面的","相...

>>
1>while循环里面的","相当于"或"运算,也就是说当满足某一个条件时(为逻辑1)就继续循环,只有到2个条件都不满足的时候停止循环.
2>正如victor所说 "&&"的作用是在第一个表达为0时就不会计算下面的值,这就是C/C++里面著名的"骤死"现象,如果是"||"那么在第一个表达式是1的时候"骤死";

"while循环里面的","相当于"或"运算",我认为myth的说法不正确,","本身是C/C++中的运算符,它是按结合性从左到右的顺序运算的,所以逗号表达式的运算结果只取决于最右边的那个逗号后的运算值,而与前面的值无关.此处while语句是否继续执行是由最后一个条件(j++<15)来决定的,而与 i--&&j--,s+=2 的逻辑运算结果无关.
PS: 我的程序通过TC和GCC测试,机器配置:AMD 2000,256MB DDR.
再PS: 希望在这个版能常看到这样的讨论,monkeyking和 myth的讨论让我等菜鸟获益非浅.
左走右走,对每一个相逢的朋友都展开笑容 \ - - //    ( @ @ ) ┏━oOOo-(_)-oOOo━━━━━━━━━┓ 一往无前 来自 网易北京

TOP

re:>>1>while循环里面的","相...

>>
1>while循环里面的","相当于"或"运算,也就是说当满足某一个条件时(为逻辑1)就继续循环,只有到2个条件都不满足的时候停止循环.
2>正如victor所说 "&&"的作用是在第一个表达为0时就不会计算下面的值,这就是C/C++里面著名的"骤死"现象,如果是"||"那么在第一个表达式是1的时候"骤死";

"while循环里面的","相当于"或"运算",我认为myth的说法不正确,","本身是C/C++中的运算符,它是按结合性从左到右的顺序运算的,所以逗号表达式的运算结果只取决于最右边的那个逗号后的运算值,而与前面的值无关.此处while语句是否继续执行是由最后一个条件(j++<15)来决定的,而与 i--&&j--,s+=2 的逻辑运算结果无关.
PS: 我的程序通过TC和GCC测试,机器配置:AMD 2000,256MB DDR.
再PS: 希望在这个版能常看到这样的讨论,monkeyking和 myth的讨论让我等菜鸟获益非浅.
左走右走,对每一个相逢的朋友都展开笑容 \ - - //    ( @ @ ) ┏━oOOo-(_)-oOOo━━━━━━━━━┓ 一往无前 来自 网易北京

TOP

re:怎么这么长呀,我不看了。

怎么这么长呀,我不看了。
我是一名新手[imga]http://www.boxou.com/img/new/newmusic000603.jpg[/imga]

TOP

re:其实问题的关键就在于sizeof(int...

其实问题的关键就在于sizeof(int)的值。

TOP

re:在linux上运行了一分钟,终于出了结果...

在linux上运行了一分钟,终于出了结果,19
A conclusion is simply the place where someone got tired of thinking.

TOP

发新话题

本论坛言论纯属发表者个人意见,与 青韶论坛 立场无关
My73_com 青韶论坛|湘潭大学最大的民间学生论坛 我的朋友,我的家!
本社区为 非官方性、非盈利性 与任何官方无责任关系,不隶属于任何官方机构。