在介绍之前引入一个问题:为什么要写循环语句?在此我们先来看一个常见问题:
为此,为了不重复输入大量的冗余代码,我们需要用到循环语句,来帮我们简化代码的结构。
循环是用来控制语句块重复执行的一种结构。Java语言中有三种主要的循环结构语句,即:for循环、while循环、do…while循环,现在对其一 一介绍
for循环
-
首先是for循环的语法结构:
for(1.初始化;2.循环继续的条件;4.每迭代一次后的操作){
3.循环体
}
for循环结构的写法并不是固定的,如可以写成:
1.初始化
for(2.循环继续的条件){
3.循环体
4.每迭代一次后的操作
}
等形式,但是为了代码规范,需要统一。
其执行流程为:1.初始化 —> 2.循环机组继续的条件 —> 3.循环体 —> 4.每迭代后的操作
如果还不理解的话,可以参考一下流程图:
for 循环只执行初始动作一次,当循环继续条件为真时,重复执行循环体中的语句,然后完成每次迭代后的操作
-
现在我们来分析上面的例题:
要打印100行"Welcome to java!",首先是从第一行开始打印的,即初始化条件为定义一个变量为1,姑且定义一个i变量吧,则 int i = 1;此时分析循环什么时候结束呢?即当打印到第100行的时候,所以 i <=100,此时执行我们的循环体 即我们要打印的内容System.out.println(“Welcome to java!”),最后就是迭代后的操作,i相当于一个计数器,对打印的行数记载,每打印一行就要计数一行,所以 i++。
综上所述,我们的程序应为
public class Demon01{
public static void mian(String[] args){
for(int i=1;i<=100;i++){
System.out.println("Welcome to java!")
}
}
}
//注:此程序很简单,只是用来引入for循环的结构
控制变量必须在循环控制结构体内或循环前说明。如果循环控制变量只在循环内使用而不在其他地方使用,那么在 for 循环的初始动作中声明它是一个很好的编程习慣。如果在循环控制结构体内声明变量,那么在循环外不能引用它。例如,不能在前面代码的for 循环外引用变量 i, 因为它是在 for 循环内声明的。
while循环
-
让我们再来看一下while循环的语法结构:
while( 循环继续的条件){
// 循环体
}
while循环没有其他书写的格式。
while循环相对for循环来说语法结构较为简单,且循环继续条件是一个布尔表达式,控制循环体的执行。在循环体执行前总是先计算循环条件以决定是否执行它。若条件为 true, 则执行循环体;若条件为 false,则终止整个循环,并且程序控制转移到 while 循环后的下一条语句,下面给出while循环的控制流程图:
while循环的继续条件是一个布尔表达式,控制循环体的执行。在循环体执行前总是先计算循环条件以决定是否执行它。若条件为 true, 则执行循环体;若条件为 false,则终止整个循环,并且程序控制转移到 while 循环后的下一条语句 -
现在让我们用while循环的语句结构来分析上面的问题:
在循环开始之前我们要先初始化,即控制打印行数的变量从第一行开始,int i=1;然后判断循环的条件i小于等于100,直到打印100行之后就结束了,循环体执行的是打印的内容System.out.println(“Welcome to java!”),每打印完变量i加一,综上所述,while循环的代码为:
public class Demon02{
public static void mian(String[] args){
int i= 1;
while(i<=100){
System.out.println("Welcome to java!");
i++;
}
}
}
do…while()
do…while 循环和 while 循环基本一样,不同的是它先执行循环体一次,然后判
断循环继续条件。do…while 循环是 while 循环的变体。它的语法如下:
do {
// 循环体 ;
语句(组 );
} while ( 循环继续条件);
所以上面的问题用do…while()语法结构实现为:
public class Demon03{
public static void mian(String[] args){
int i =1;
do{
System.out.println("Welcome to java!");
i++;
}while(i<100)
}
}
程序员经常会犯的错误就是使循环多执行一次或少执行一次。这种情况通常称为差一錯误( off by one error)。例如:上面的循环可能会将 Welcome to ]ava 显示 101次,而不是100 次。这个错误出在条件部分,所以条件应该是 i<100 而不是 i<=100。
while 循环与 do…while 循环的差别在于:计算循环继续条件和执行循环体的先后顺序不同。有时候,选择其中一种会比另一种更方便,可以在后续讲解题中慢慢的理解。
要保证循环继续条件最终可以变为 false,以便程序能够结束。一个常见的程序设计错误是无限循环(也就是说,循环会永远执行下去)。如果程序运行了不寻常的长时间而不结束,可能其中有无限循环。如果你是从命令窗口运行程序的,按 CTRL+C 键来结束。
无限循环
无限循环的原因是没有判断循环继续的条件或是永远没有达到循环结束的条件,死循环的语法结构是for( ;;){ }和while(true){ },两者都是无条件先进入死循环,在循环体中判断循环结束的条件,死循环并不是不好的,有时候没有给出初始化条件或不知道要循环几次,只能根据循环体中的执行结果才能判断当前是否跳出循环,此时就必须先进入死循环。上面的问题也可以用先进入死循环的方法进行打印。如:
public class Demon4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i =1;
for(;;){ //进入死循环
System.out.println("Welcome to java!");
i++;
if(i>100) { //当打印到的行数超过100行时
break; //跳出死循环
}
}
}
}
关键字break和continue
在上面无限循环的代码中,判断打印的行数到100行以上以后,就跳出了循环,其中用到了一个“break”关键字,其实还有一个控制循环的关键字为“continue”,顾名思义,break是打破的意思,即打破循环使循环终止,但终止的是当前break所在的循环,并不能结束程序中所有的循环,而且不管循环是否运行完,都会强行跳出;相反continue是继续的意思,当程序遇到这个关键字时,会继续执行当前循环,直到当前的循环自行结束或者遇到brake,才会停止。
关键字 break 和 continue 都可以在循环语句中使用,为循环提供额外的控制。在某些情况下,使用 break 和 continue 可以简化程序设计。但是,过度使用或者不正确地使用它们会使得程序难以读懂也难以调试。下面我们来看一个代码示例:
continue 语句总是在一个循环内。在 while 和 do…while 循环中,continue 语句之
后会马上计算循环继续条件;而在 for 循环中,continue 语句之后会立即先执行每次迭代
后的动作,再计算循环继续条件。
小结
循环设计策略
编写一个正确的循环对编程新手来说,并不是件容易的事。编写循环时应该考虑如下三
个步骤:
- 第一步:确定需要重复的语句。
-
第二步:将这些语句放在一个循环中,如下所示:
while(true){
语句组 ;
}
-
第三步:为循环继续条件编码,并为控制循环添加适合的语句。
while( 循环继续条件){
语句组 ;
用于控制循环的附件语句 ;
}
在选择用哪个循环时,可以根据哪个更加方便,来使用 for 循环、while 循环,或者 do…while 循环,这是根据解决问题的要求而来的。
while 循环和 for 循环都称为前测循环( pretest loop), 因为继续条件是在循环体执行之前检测的,do…while 循环称为后测循环( posttest loop), 因为循环条件是在循环体执行之后检测的。三种形式的循环语句:while、do…while 和 for, 在表达上是等价的。也就是说,可以使用这三种形式之一来编写一个循环。一般情况下while 循环与for 循环之间可以相互转化。
建议使用自己觉得最自然、最舒服的一种循环语句。通常,如果已经提前知道重复次数,那就采用 for 循环,例如,需要打印一条信息 100 次时,如果无法确定重复次数,就采用 while 循环,就像读入一些数值直到读入 0 为止的这种情况。如果在检验继续条件前需要执行循环体,就用 do…while 循环替代while循环。
目前循环的语句已经介绍完毕,还有一些细节问题和解题思路会在后续讲解中慢慢引入。