循环是程序中的重要流程结构之一。
循环语句能够使程序代码重复执行,适用于需要重复一段代码直到满足特定条件为止的情
况。
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直执行下去,形成死循环。
循环语句可能包含如下 4 个部分。
初始化语句(init statement): 一条或多条语句,这些语句用于完成一些初始化工
作,初始化语句在循环开始之前执行。
循环条件(test_expression):这是一个 boolean 表达式,这个表达式能决定是否
执行循环体。
循环体(body_statement):这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。如果这个代码块只有一行语句,则这个代码块的花括号是可以省略的。
迭代语句(iteration_statement):这个部分在一次循环体执行结束后,对循环条
件求值之前执行,使通常用于控制循环条件中的变量,得循环在合适的时候结束。
while 语句
while 语句是 Java 最基本的循环语句,是一种先判断的循环结构,可以在一定条件下重复执行一段代码。该语句需要判断一个测试条件,如果该条件为真,则执行循环语句(循环语句可以是一条或多条),否则跳出循环。
while 循环语句的语法结构如下:
while(条件表达式) { 语句块; }
其中语句块中的代码可以是一条或者多条语句,而条件表达式是一个有效的 boolean 表达式,它决定了是否执行循环体。当条件表达式的值为 true 时,就执行大括号中的语块。执行完毕,再次检查表达式是否为 true,如果还为 true,则再次执行大括号中的代码,否则就跳出循环,执行 while 循环之后的代码。图 1 表示了 while 循环语句的执行流程。
图 1 while 循环语句执行流程图
例 1
使用 while 语句计算 10 的阶乘,其具体代码如下所示。
public static void main(String[] args) {
int i = 1;
int n = 1;
while(i <= 10) {
n=n*i;
i++;
}
System.out.println("10 的阶乘结果为:"+n);
}
在上述代码中,定义了两个变量 i 和 n,循环每执行一次 i 值就加 1,判断 i 的值是否小于等于 10,并利用 n=n*i 语句来实现阶乘。当 i 的值大于 10 之后,循环便不再执行并退出循环。
运行程序,执行的结果如下所示:
10 的阶乘结果为:3628800
do-while 语句
如你刚才所见,如果 while 循环一开始条件表达式就是假的,那么循环体就根本不被执行。然而,有时需要在开始时条件表达式即使是假的情况下,while 循环至少也要执行一次。换句话说,有时你需要在一次循环结束后再测试中止表达式,而不是在循环开始时。
Java 就提供了这样的循环:do-while 循环。do-while 循环语句也是 Java 中运用广泛的循环语句,它由循环条件和循环体组成,但它与 while 语句略有不同。do-while 循环语句的特点是先执行循环体,然后判断循环条件是否成立。
do-while 语句的语法格式如下:
do { 语句块; }while(条件表达式);
以上语句的执行过程是,首先执行一次循环操作,然后再判断 while 后面的条件表达式是
否为 true,如果循环条件满足,循环继续执行,否则退出循环。while 语句后必须以分号
表示循环结束,其运行流程如图 2 所示。
图 2 do-while 循环语句的执行流程
例 2
编写一个程序,计算 10 的阶乘。使用 do-while 循环的实现代码如下所示。
public static void main(String[] args) {
int number = 1,result = 1;
do {
result*=number;
number++;
}while(number <= 10);
System.out.print("10 阶乘结果是:"+result);
}
程序运行后输出结果如下:
10 阶乘结果是:3628800
while 和 do-while 的比较
while 循环和 do-while 循环的相同处是:都是循环结构,使用 while(循环条件) 表示循环条件,使用大括号将循环操作括起来。
while 循环和 do-while 循环的不同处如下:
语法不同:与 while 循环相比,do-while 循环将 while 关键字和循环条件放在后面
,而且前面多了 do 关键字,后面多了一个分号。
执行次序不同:while 循环先判断,再执行。do-while 循环先执行,再判断。
一开始循环条件就不满足的情况下,while 循环一次都不会执行,do-while 循环则
不管什么情况下都至少执行一次。
for 语句是应用最广泛、功能最强的一种循环语句。
大部分情况下,for 循环可以代替 while 循环、do while 循环。
for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。
for 语句通常使用在知道循环次数的循环中。
for 语句语法格式如下所示。
for(条件表达式 1;条件表达式 2;条件表达式 3) { 语句块; }
for 循环中 3 个条件表达式的含义如表 1 所示。
for 关键字后面括号中的 3 个条件表达式必须用“;”隔开。
for 循环中的这 3 部分以及大括号中使循环体必需的 4 个组成部分完美地结合在一起,简单明了。
for 循环语句执行的过程为:首先执行条件表达式 1 进行初始化,然后判断条件表达式 2的值是否为 true,如果为 true,则执行循环体语句块;否则直接退出循环。最后执行表达式 3,改变循环变量的值,至此完成一次循环。接下来进行下一次循环,直到条件表达式2 的值为 false,才结束循环,其运行流程如图 1 所示。
图 1 for 循环执行流程图
值得指出的是,for 循环的循环迭代语句并没有与循环体放在一起,因此即使在执行循环体时遇到 continue 语句结束本次循环,循环迭代语句也一样会得到执行。
for 循环和 while、do while 循环不一样:由于 while、do while 循环的循环迭代语句紧跟着循环体,因此如果循环体不能完全执行,如使用 continue 语句来结束本次循环,则循环迭代语句不会被执行。但 for 循环的循环迭代语句并没有与循环体放在一起,因此不管是否使用 continue 语句来结束本次循环,循环迭代语句一样会获得执行。
与前面循环类似的是,如果循环体只有一行语句,那么循环体的大括号可以省略。
例如,同样是计算 5 的阶乘,使用 for 循环的实现代码如下:
public static void main(String[] args) {
int result = 1;
for (int number = 1; number <= 5; number++) {
result *= number;
}
System.out.print("5 的阶乘结果是:" + result); // 输出"5 的阶乘结果是:120"
}
上述语句的含义可以理解为,将 number 变量的值从 1 开始,每次递增 1,直到大于 5 时终止循环。在循环过程中,将 number 的值与当前 result 的值进行相乘。
注意:for 语句中初始化、循环条件以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。
例如,计算 1~100 所有奇数的和,使用这种方式的代码如下:
public static void main(String[] args) {
int result = 0;
int number = 1; // 相当于 for 语句的条件表达式 1
for (;;) {
if (number > 100)
break; // 相当于 for 语句的条件表达式 2
if (number % 2 != 0) // 如果不能整除 2,说明是奇数,则进行累加
result += number;
number++; // 相当于 for 语句的条件表达式 3
}
System.out.print("100 以内所有奇数和为: " + result);
}
for、do-while 和 while 的区别
它们的区别,如下表 2 所示。
例 2
分别用 for、do-while 和 while 求出 1-10 的和。
1)使用 for 循环
代码如下:
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i < 11; i++) {
sum = sum + i;
}
System.out.println(sum);
}
运行结果为 55。
2)使用 do-while 循环
代码如下:
public static void main(String[] args) {
int sum = 0;
int i = 1;
do {
sum = sum + i;
i++;
} while (i < 11);
System.out.println(sum);
}
运行结果为 55。
3)使用 while 循环
代码如下:
public static void main(String[] args) {
int sum = 0;
int i = 1;
while (i < 11) {
sum = sum + i;
i++;
}
System.out.println(sum);
}
运行结果为 55。