循环控制

循环控制包含两方面的内容,一方面是控制循环变量的变化方式,另一方面是控制循环的跳转。控制循环的跳转需要使用 break 和 continue 两个关键字,这两条跳转语句的跳转效果不同,break 语句是中断循环,continue 语句是执行下一次循环。

break语句

使用 break 语句可以跳出 switch 结构。在循环结构中,同样也可用 break 语句跳出当前循环体,从而中断当前循环。

在 3 种循环语句中使用 break 语句的形式如图4.16所示。

image 2024 02 28 14 34 15 841
Figure 1. 图4.16 break语句的使用形式

【例4.10】输出1~20出现的第一个偶数(实例位置:资源包\TM\sl\4\10)

创建 BreakTest 类,循环输出1~20的偶数值,在遇到第一个偶数时,使用 break 语句结束循环。

public class BreakTest {
	public static void main(String[] args) {
		for (int i = 1; i < 20; i++) {		// 如果i是偶数
			if (i % 2 == 0) {				// 如果i是偶数
				System.out.println(i);		// 输出i的值
				break;						// 跳到下一循环
			}
		}
		System.out.println("---end---");		// 结束时输出一行文字
	}
}

运行结果如下:

     2
     ---end---

在循环嵌套情况下,break 语句将只会使程序流程跳出包含它的最内层的循环结构,即只跳出一层循环。

如果想让 break 跳出外层循环,Java 提供了 “标签” 的功能,语法如下:

     标签名: 循环体{
          break标签名;
     }
  • 标签名:任意标识符。

  • 循环体:任意循环语句。

  • break 标签名:break 跳出指定的循环体,此循环体的标签名必须与 break 的标签名一致。

带有标签的 break 可以指定跳出的循环,这个循环可以是内层循环,也可以是外层循环。

【例4.11】使用标签让break结束外层循环(实例位置:资源包\TM\sl\4\11)

创建 BreakInsideNested 类,在该类中写两层 for 循环,第一层 for 语句循环 3 次,第二层 for 语句循环 5 次。当第二层 for 语句循环至第 4 次时,强行用 break 中断循环。输出程序执行时外层循环和内层循环各循环了多少次。

public class BreakInsideNested {
	public static void main(String[] args) {
		Loop: for (int i = 1; i <= 3; i++) {// 外层循环,添加了标签
			for (int j = 1; j <= 5; j++) {// 内层循环
				if (j == 4) { // 内层循环至第4次时就结束
					break Loop;// 结束指定位置的循环
				}
				System.out.println("i=" + i + " j=" + j);
			}
		}
	}
}

运行结果如下:

     i=1 j=1
     i=1 j=2
     i=1 j=3
     i=2 j=1
     i=2 j=2
     i=2 j=3
     i=3 j=1
     i=3 j=2
     i=3 j=3

从这个运行结果中可以看到以下内容。

  • 循环中的 if 语句判断:当 j 等于 4 时,执行 break 语句,中断了内层的循环,所以输出的 j 值最大到 3 为止。

  • 外层的循环没有受任何影响,输出的 i 值最大为 3,正是 for 循环设定的最大值。

现在修改这段代码,给外层循环添加一个名为 Loop 的标签,让内层循环结束外层循环,再查看运行结果。

public class BreakInsideNested2 {
	public static void main(String[] args) {
		for (int i = 1; i <= 3; i++) {// 外层循环
			for (int j = 1; j <= 5; j++) {// 内层循环
				if (j == 4) { // 内层循环至第4次时就结束
					break;
				}
				System.out.println("i=" + i + " j=" + j);
			}
		}
	}
}

运行结果如下:

     i=1 j=1
     i=1 j=2
     i=1 j=3

从这个结果中可以看出,当 j 的值等于 4 时,直接结束外层循环,i 的值不再增加。

continue语句

continue 语句是针对 break 语句的补充。continue 不是立即跳出循环体,而是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。在 for 循环语句中遇到 continue 后,首先执行循环的增量部分,然后进行条件测试。在 while 和 do…while 循环中,continue 语句使控制直接回到条件测试部分。

在 3 种循环语句中,使用 continue 语句的形式如图4.17所示。

image 2024 02 28 15 26 49 277
Figure 2. 图4.17 continue语句的使用形式

【例4.12】输出1~20的奇数(实例位置:资源包\TM\sl\4\12)

创建 ContinueTest 类,编写一个 for 循环从 1 循环至 20,如果当前循环的次数为偶数,则使用 continue 语句跳过循环。

public class ContinueTest {
	public static void main(String[] args) {
		for (int i = 1; i <= 20; i++) {
			if (i % 2 == 0) { // 如果i是偶数
				continue; // 跳到下一循环
			}
			System.out.println(i); // 输出i的值
		}
	}
}

运行结果如下:

     1
     3
     5
     7
     9
     11
     13
     15
     17
     19

与 break 语句一样,continue 也支持标签功能,语法如下:

     标签名 : 循环体{
          continue标签名;
     }
  • 标签名:任意标识符。

  • 循环体:任意循环语句。

  • continue 标签名:continue 跳出指定的循环体,此循环体的标签名必须与 continue 的标签名一致。

编程训练(答案位置:资源包\TM\sl\4\编程训练)

【训练5】蜗牛爬井 有一口井,深10米,一只蜗牛从井底向井口爬,白天向上爬2米,晚上向下滑1米,问多少天可以爬到井口?

【训练6】剧院售票 某剧院发售演出门票,演播厅观众席有4行,每行有10个座位。为了不影响观众视角,在发售门票时,屏蔽掉最左一列和最右一列的座位。请编写程序,结合本节知识点模拟整个售票过程。