循环语句属于重复结构中的流程控制语句,当设置的条件符合时,就会执行循环中的程序语句,一旦条件不符合就会跳出循环。循环语句分为for、while和do-while三种。
假如想要让计算机在屏幕上打印出500个字符'*',我们并不需要大费周章地编写500次System.out.print语句,这时只需要使用重复结构即可。Java语言提供了for、while以及do-while三种循环语句来实现重复结构的效果。在尚未开始正式介绍循环语句之前,我们先通过表3-2快速看看这三种循环语句的特性及使用时机。
表3-2
for循环又称为计数循环,是程序设计中较常使用的一种循环形式,可以重复执行固定次数的循环。for语句是一种较严谨的循环语句,是一种计数循环(Counting Loop),循环语句中设置有“循环计数变量的起始值”“循环条件”和“循环计数变量的递增或递减表达式”。for语句的声明语法如下:
for (循环计数变量的起始值;循环条件;循环计数变量的递增或递减表达式) { 程序语句区块; }
·循环计数变量的起始值:是for循环第一次开始时循环计数变量的初值。
·循环条件:当for语句循环的条件结果为false时,循环就会结束。
·循环计数变量的递增或递减表达式:每轮循环执行后,循环变量要增加或减少的表达式。
for循环的执行步骤说明如下。
步骤1:设置循环计数变量的起始值。
步骤2:如果循环条件表达式的结果为真(true),就执行for循环体内的程序语句。
步骤3:循环体内的程序语句执行完成之后,增加或减少循环计数变量的值,递增或递减的步长可以根据需求而定,再重复步骤2。
步骤4:如果循环条件表达式的结果为假(false),就结束for循环。
例如:
for (int i=0;i <=5;i++) { a=a+1; }
上面的程序表示:循环计数变量的起始值i=0,重复执行次数是循环条件i<=5成立时,循环变量的递增量是1(步长为1)。若未超出重复执行次数(循环条件依然成立时),则执行“a=a+1”;若i=6,超出了重复执行次数(循环条件i<=5不成立了),则结束for循环。
【范例程序:CH03_08】
01 /*文件:CH03_08.java 02 *说明:for循环应用范例 03 */ 04 public class CH03_08{ 05 public static void main(String args[]){ 06 System.out.println("计算1~10之间所有奇数的和"); 07 int sum=0;//声明存储奇数总和的变量,并赋初值为0 08 System.out.println("1~10之间所有的奇数为:"); 09 for(int i=1; i<=10;i++){ 10 if(i%2!=0){//使用if语句判断i是否为奇数 11 sum+=i; 12 System.out.print(i+" "); 13 } 14 } 15 System.out.println(); 16 System.out.println("答案="+sum);//输出答案 17 } 18 }
【程序的执行结果】
程序的执行结果可参考图3-13。
图3-13
【程序的解析】
第10行:使用i%2的结果判断i是否为奇数,当i为奇数时i%2的结果应该为1。
第09~14行:是for循环。循环条件“i<=10”表示循环总共要执行11次,因为i一直增加到11时,“i<=10”的循环条件就不成立了,即达到循环结束的条件。所以当i=11时,就不会再进入for循环体,第10~13行的程序代码共执行了10次。
所谓嵌套for循环,就是多层的for循环结构。在嵌套for循环结构中,执行流程必须先等内层循环执行完毕,才会逐层继续执行外层循环。注意容易犯错的地方是内外循环间不可交错。嵌套for循环的典型应用例子是“九九乘法表”。嵌套for语句的语法如下:
for ( 外层循环的计数变量起始值;循环条件;计数变量的递增或递减值 ) { for ( 内层循环的计数变量起始值;循环条件;计数变量的递增或递减值 ) { 程序语句区块; } };
【范例程序:CH03_09】
01 /*文件:CH03_09.java 02 *说明:嵌套for循环应用范例 03 */ 04 05 public class CH03_09{ 06 public static void main(String[] ages){ 07 for (int i=1;i<=9;i++){ 08 for (int j=1;j<=9;j++){ 09 System.out.print(i+"*"+j+"="+i*j+'\t'); 10 } 11 System.out.print('\n'); 12 } 13 } 14 }
【程序的执行结果】
程序的执行结果可参考图3-14。
图3-14
如果循环执行的次数可以确定,那么for循环就是最佳的选择。对于那些不能确定循环次数的循环,while循环就可以派上用场了。while循环与for循环类似,都属于前测试型循环。前测试型循环的工作方式是在循环体开始执行前必须先检查循环条件表达式,当表达式结果为真(true)时,才会执行循环体内的程序语句;如果循环条件表达式结果为假(false),就会结束循环。While循环语句的语法如下:
while (循环条件表达式 ) { 循环体内的程序语句; 循环条件变量的变化; }
如图3-15所示为while循环的流程图。
图3-15
当while语句的循环条件表达式的结果为真(true)时,就会重复执行循环体内的程序语句,直到循环条件表达式的结果为假(false),才会结束while循环。在进行while循环时,通常会先在while循环之前加上一个变量并赋初值,用于控制while循环的变量,在while循环体内根据循环的需要更改这个变量的值,以便在执行新一轮循环前用来测试循环条件是否成立,例如:
while (i<=10 ) { a=i+1; i++; //更改循环变量的值 }
While语句括号内的部分是“循环条件”,“i<=10”表示只有i值小于等于10,才能够进入while循环体内,执行“a=i+1”,而后更改循环变量i的值(在此例中是用i++递增的)。
【范例程序:CH03_10】
01 /*文件:CH03_10.java 02 *说明:while循环应用范例 03 */ 04 public class CH03_10{ 05 public static void main(String args[ ]){ 06 int n=1,sum=0;//声明while循环变量n并赋初值,声明存储累加值的变量sum 07 //while循环开始 08 while(n<=10){ 09 System.out.print("n="+n); 10 sum+=n;//计算n的累加值 11 System.out.println("\t累加值="+sum); 12 n++; 13 } 14 System.out.println("循环结束"); 15 } 16 }
【程序的执行结果】
程序的执行结果可参考图3-16。
图3-16
【程序的解析】
第08行:n<=10是while语句的循环条件表达式,当该表达式的结果为真(true)时,就会重复执行循环体内的程序语句。
第12行:将计数器n递增1,再回到第08行检查循环条件是否依然成立,如果表达式结果为假(false),就会结束这个while循环,继续执行while循环体后面的第14行程序语句。
do-while循环是先执行循环体内的程序语句,再测试循环条件是否成立,这与之前的for循环、while循环不同。do-while循环属于“后测型”循环,for循环、while循环属于“前测型”循环。do-while循环无论如何都会执行一次循环体内的程序语句,再测试循环条件是否成立,如果成立,就返回循环起点,重复执行循环体内的程序语句。
do-while循环与while循环类似,两者的差别就是循环条件表达式所在的位置有前后之分。do-while循环语句的语法如下:
do { 循环体内的程序语句; 循环条件变量的变化; } while (循环条件表达式);
【范例程序:CH03_11】
01 /*文件:CH03_11.java 02 *说明:do-while循环应用范例 03 */ 04 public class CH03_11{ 05 public static void main(String args[]){ 06 int n=40,m=180; 07 int temp=0;//作为n与m值互换的中间暂存变量 08 System.out.println("n="+n+",m="+m); 09 //do-while循环开始 10 do{ 11 temp=m%n; 12 m=n; 13 n=temp; 14 }while(n!=0 );//检查循环条件表达式 15 System.out.println("两个数的最大公约数="+m); 16 } 17 }
【程序的执行结果】
程序的执行结果可参考图3-17。
图3-17
【程序的解析】
第11行:将m%n的运算结果(余数)赋值给temp,此处m的值必须大于n的值。
第12~13行:借助中间暂存变量temp将n与m的值对调,因为此时n的值大于m的值。
在循环语句中设置循环条件表达式时,必须注意不能使循环条件永远成立,否则就会形成无限循环(或称为死循环)。下面列出几个常见的无限循环的例子,请大家在编写循环语句的时候避免出现无限循环。
while(true){ } //while语句中的循环条件永远为true for(;;){ } //for语句中没有设置任何循环条件 for(int i=1;i>0;i++){ } //循环条件与初始值相比较永远成立