以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  荤菜求助:关于break的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=44716)


--  作者:荤菜
--  发布时间:4/2/2007 12:34:00 AM

--  荤菜求助:关于break的问题
1--100个数,目的是当碰到10时,结束循环打印出1--10
程序1
main()
{int s,i,c;
for(s=1;s<=100;s++)
{c=s%10;
if(c==0)
break;                /*我认为算到这一步时,虽然break;跳出循环,但s=10*/
printf("%4d",s);}    /*我认为由于break;这一行将不会打印出10*/
printf("%4d",s);    /*完成最后一次循环后,s还要加1因此s=10+1=11才终止循环,所以这一行应打印出11*/
getch();
}
但我只想让它得出这样的错误结果1 2 3 4 5 6 7 8 9 11
却得出正确的结果1 2 3 4 5 6 7 8 9 10,(我只要错误的结果!)为什么会这样


程序2
目的是求出2--100间的素数
#include "math.h"
main()
{int m,i,k;
for(m=2;m<=100;m++)
{k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)            /*完成最后一次循环后,i还要加1因此i=k+1才终止循环,我就是看了这一行,才认为程序1打印出最后一个数是11*/
printf("%4d",m);
}
getch();
}
我就想问:程序1和程序2中的i都进行循环,程序2经过break后i要加1,因此i=k+1,才能得出正确结果.程序1经过break后i要不要加1,如果要加1,最后一个数应该输出11但事实上最后一个数输出的却是10.
就算我是在钻牛角尖,拜托了,我想得脑袋都裂了!


--  作者:fangel2000
--  发布时间:4/2/2007 10:54:00 AM

--  
main()
{int s,i,c;
for(s=1;s<=100;s++)
{c=s%10;
if(c==0)
break;                /*我认为算到这一步时,虽然break;跳出循环,但s=10*/
printf("%4d",s);}    /*我认为由于break;这一行将不会打印出10*/
printf("%4d",s);    /*完成最后一次循环后,s还要加1因此s=10+1=11才终止循环,所以这一行应打印出11*/
getch();
}

s=10跳出循环,不再加1


--  作者:一分之千
--  发布时间:4/3/2007 5:19:00 PM

--  
楼上说的对,这个地方你得注意一个问题,第一个程序之所以跳出,是因为除法余数为0.而不是因为s为11>10才跳出循环的. s的递增是在循环进行倒最后的时候进行的.而不是在break的时候~
--  作者:荤菜
--  发布时间:4/7/2007 5:17:00 PM

--  
谢谢,我有点明白了.我认为程序一之所以跳出,是因为除法余数为0,然后一个break语句结束了它的生命,循环跳出.而第二个程序(if(m%i==0)break;)这一行,是因为当m除以i不为0的时候(也就是break没有起作用的时候),i的寿命已尽,才一命呜呼跳出循环的.
--  作者:Christopher-sky
--  发布时间:4/8/2007 3:38:00 AM

--  
认识到了问题的原因了哈
谢谢哈...
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms