【抛砖引玉】深入理解for循环运行机制及break和continue的作用
java吧
全部回复
仅看楼主
level 6
Zebe_32 楼主
深入理解for循环及流程控制。在标准的for循环结构中:for(初始化;条件;迭代),初始化部分仅执行一次。当这个循环被运行,它就执行了。在之后运行的过程中,即使用跳转语句重新跳转到这个循环的开始处,这个初始化部分也不会被再次执行。
要深入理解for循环,就必须理解break和continue语句的真正作用。通过下面这个例子,可以深刻理解for循环的工作原理,以及break和continue语句。
public static void main(String[] args) {
int i =0; // 声明一个整型变量 i,赋初值为0
for(i=1;i<=10;i++){ // 建立一个循环,从1到10,迭代器每次递增1
if(i==5){ // 当迭代器的值等于5时,
System.out.println("break"); // 在控制台打印一个break消息
break; // 中断循环
}
}
System.out.println("循环结束。当前 i 的值="+i);
}
执行以上程式,控制台输出的 i 的值是5。现在分析它运行的过程:
A 程序运行,i 的值等于0。
B 进入for循环,执行此结构中初始化部分,执行后,i 的值等于1。
C 判断i<=10条件是否成立?若成立则执行D,否则执行G。
D 执行循环体。如果 i 等于5,执行E;否则,执行F。
E 在控制台打印出“break”,然后中断循环,执行G。
F 迭代器递增1,即 i 的值增1,然后执行C。
G 执行for循环后的语句,在控制台打印出当前 i 的值。
以上就是for循环工作的过程。首先运行初始化部分,运行后判断条件是否成立,如果成立就执行循环体,否则直接跳过循环。执行循环体后,执行迭代部分,执行完后,循环增量发生了变化,继续判断是否满足条件,若满足条件就继续执行循环体,然后再执行迭代部分,以此类推,直到迭代部分得到的值不满足条件时,循环结束。
在以上的程序中,如果循环体为空,即什么内容都不执行,仅运行一个空循环,最后输出的 i 的值是多少呢?答案是11。因为 i 是在方法内部被定义的,所以整个方法内部有效,当循环执行完后,循环中的迭代器最后一次将 i 的值调到了11,这样就导致了循环结束。所以最后输出的结果是11。这也说明了一个问题,迭代器在for循环的工作流程中,它在首次循环过后就正式“上班”,而初始化部分正式“辞职”。
continue语句的作用又是什么呢?如果将上面程式中的break语句换成continue。那么最后输出的结果是11。continue的功能应当如何理解?
“中断本次循环,重新回到循环语句的调用处开始新一轮的循环”。在很多书籍和资料上都这样说明它的作用,这很容易让人产生误解,主要是"中断"和“新的一轮循环”这两句话可能产生误解。如果本次循环中断了,开始新的一轮循环,那么迭代器的值究竟是多少,会被初始化部分重新初始化吗?还是使用现在的值呢?上面已经说到,迭代器在for循环的工作流程中,它在首次循环过后就正式“上班”,而初始化部分正式“辞职”。 也就是说,初始化部分早就“辞职”了,不可能再继续“工作”,而迭代器仍然在勤奋的“工作”。当使用了continue这个语句之后,它首先忽视掉自身后面所有的语句,然后通知迭代器继续“工作”。于是,迭代器再次发生变化,再次判断,再次执行或者结束循环。这才是“中断本次循环”的真正含义 ,它并不是停止,而是中断。何谓中断,可以理解为“从中间断开”,从continue这个语句所在的地方断开。因此这个语句的作用可以概括为“忽略之后的语句,通知循环继续工作”。这个语句的好处就在于能够跳过那些暂时不需要被执行的语句。
在下乃新手中的新手,首发原创贴,以证明自己确实又向前迈进一小步了,呵呵。这是自己对for循环以及流程控制的理解,有误之处还请各位指出。
2013年03月04日 05点03分 1
level 12
擦!
2013年03月04日 05点03分 2
是不是看累了啊
2013年03月04日 06点03分
level 11
所谓专家 就是把比较懂的东西 研究的深入后 无人想懂[惆怅~]
2013年03月04日 06点03分 3
[惆怅~]
2013年03月04日 08点03分
回复 sharez :每个人的目标不一样而已 有的人是学着玩 有的人拿来谋生 有的人是技术狂
2013年03月04日 13点03分
精辟,其实能分清Break和continue就行了,看多也就一眼的事
2013年03月04日 14点03分

2013年03月05日 01点03分
level 2
[抖胸]
mov cx,楼主你看
s:你看
loop s
2013年03月04日 06点03分 4
这是什么语言
2013年03月04日 13点03分
想起了上微机和单片机的时候[呵呵]
2013年03月04日 13点03分
根本看不懂啊 底层的东西我从来没接触过 一直都在学皮毛
2013年03月05日 01点03分
回复 Zebe_32 :汇编语言
2013年03月05日 01点03分
level 13
难道不能直接这么说,碰到break就直接结束循环?碰到continue就是暂停一下,继续循环?
2013年03月04日 07点03分 5
如果说暂停,也不是很恰当啊 break有可能不直接结束循环 比如多重循环的嵌套 它只结束当前的循环 或者结束标签指向的一个循环
2013年03月04日 13点03分
回复 Zebe_32 :嗯,学习了
2013年03月04日 14点03分
break是跳出当前循环,continue是跳过本次循环体。带标签适用于多重循环。
2013年03月05日 01点03分
you are right
2013年03月05日 01点03分
level 9
本来懂得,看了楼主的贴子果断蒙了[拍砖]
2013年03月04日 15点03分 6
哈哈
2013年03月05日 01点03分
level 9
技术贴要顶。。。
2013年03月05日 01点03分 8
这哪能算得上技术贴。。。
2013年03月05日 01点03分
level 6
膜拜华佗大婶。。。@dtph007
2013年03月05日 01点03分 9
level 5
谢谢了啊,我最近正需要这方面的内容呢。[飞吻]
2013年03月05日 02点03分 10
我起初也不怎么理解,老是分不清,做了一些练习之后才掌握的
2013年03月05日 05点03分
level 13
留名
——来自 爱贴吧 Windows Phone 客户端
2013年03月05日 02点03分 11
level 9
本来懂得,楼主干嘛非要弄得这么复杂,啧啧
2013年03月05日 02点03分 12
程序不就是复杂的麽 哈哈哈
2013年03月05日 05点03分
level 5
既然你理解的这么透彻,那你能告诉我以下这个题目的答案是多少吗?
int sum = 0,i;
for(i = 1;i < 4;i++) {
switch(i) {
case 1:
sum = sum + 2;
case 2:
sum = sum + 4;
continue;
case 3:
sum = sum + 16;
break;
}
}
2013年03月05日 02点03分 13
阅读上面的程序段,写出程序结束后变量sum的值。谢谢~
2013年03月05日 02点03分
回复 zts4690 :我会了 谢谢
2013年03月05日 03点03分
i=1时,找到满足条件的case 1,sum=2,因为该case下面没有break,所以程序继续执行case 2下面的语句,sum=6,然后通过continue中断本次循环并返回,此时i=2,找到满足条件的case 2,sum=10,然后又中断,此时i=3,找到满足条件的case 3,sum=26。此时迭代器增1,i=4,条件不满足循环结束。
2013年03月05日 05点03分
回复 Zebe_32 :很详细,谢谢啊。
2013年03月05日 08点03分
level 7
没那么复杂。。。就咱找字面自已就行。
Break:断了,跳出For
Continue:继续,跳过本条,处理下一条。
多了,就是废话了
2013年03月05日 03点03分 14
经典
2013年03月05日 03点03分
1