一、循环的基本结构
为了讲解方便,我们可以将循环结构划分为四个部分来进行描述。当然,这四个部分并不是都要出现,甚至在都不出现时也可以构成一个循环结构。并且,对于不同的循环结构,每个部分的相对位置也不同。
1. 初始化部分
在进入循环结构之前可以定义一些循环中以及循环结束后都要用到的变量,进行赋值。
2. 判断条件部分
用于决定是否继续进行循环,如果为假,则循环结束。判断部分可以直接使用一个布尔类型的变量,或者使用表达式,但是必须保证表达式的结果为布尔类型。
3. 循环体部分
循环结构的核心部分,用于书写每次想要重复执行的代码,通常要根据程序功能来设计。
4. 迭代部分
用于辅助控制循环的结束,在循环体之后执行,如变量自增等。
与判断结构类似,当不使用大括号时,循环结构只能控制一行代码,通常我们会添加大括号
二、while循环
1. 循环结构
[初始化部分] while(条件判断部分){ 循环体 [迭代部分] }
2. 循环特点
对于while循环,通常用于循环次数不确定时,如:让使用者决定什么时候退出循环。
- 可以用一个布尔变量直接来决定循环是否继续
- 可以用break关键字随时跳出循环
- 当条件判断部分不成立时结束循环
- 初始化部分和迭代部分可以省略
- 条件判断部分后如果出现分号会导致结构直接结束
3. 示例程序
- 循环输出1到9
public static void main(String[] args){ // 初始化部分 int i = 1; // 括号中为循环继续执行的条件:当i的值小于等于9时 while(i <= 9){ // 循环体部分 System.out.println(i); // 迭代部分:辅助控制循环结束或根据循环体的需要来写 i++; } }
- 猜字程序
import java.util.Scanner; import java.util.Random; public class Test{ public static void main(String[] args){ // 初始化Scanner,用于从键盘读入数据 Scanner sc = new Scanner(System.in); // 初始化随机数生成工具 Random random = new Random(); // 随机生成一个0~99的整数 int n = random.nextInt(100); // 定义一个布尔类型的变量,用于控制循环的结束 boolean flag = true; // 使用flag作为控制循环结束的变量 while(flag){ System.out.println("请输入一个数:"); // 从键盘读取一个数 int temp = sc.nextInt(); // 判断输入的数是否与随机数相同,猜中则退出 if(temp == n){ System.out.println("猜中了!"); // 修改flag为false,使得循环退出 flag = false; }else{ // 如果没有猜中,就让用户自己决定是不是要继续猜 System.out.println("猜错了!还要继续吗?1:继续2:退出"); // 如果输入的数字为2则退出(此处暂不考虑输入出错等其他情况) if(sc.nextInt() == 2){ // 修改flag为false,使得循环退出 flag = false; } } } // 使用后关闭 sc.close(); } }
三、do-while循环
1. 循环结构
[初始化部分] do{ 循环体 [迭代部分] }while(条件判断部分);
2. 循环特点
do-while循环与while循环的用法基本相同,主要的不同点在于循环体(迭代部分)一定会先执行一次,然后再进行判断,这非常适合在初学时做成菜单程序。
- 可以用一个布尔变量直接来决定循环是否继续
- 可以用break关键字随时跳出循环
- 当条件判断部分不成立时结束循环
- 初始化部分和迭代部分可以省略
3. 示例程序
- 菜单程序
break只能跳出离自己最近一层的switch-case或循环结构,如果想直接跳出指定层的循环,需要使用到自定义标签。自定义标签的用法比较简单,直接在一个循环结构的起始位置加一个单词,配合冒号使用,在进行跳出时,可以在break后面添加自定义标签的名称,即可跳出指定层的循环。
import java.util.Scanner; public class Test{ public static void main(String[] args){ // 初始化Scanner,用于从键盘读入数据 Scanner sc = new Scanner(System.in); // 在此处使用自定义标签out(名称可以自定义)来进行标记 out:do{ System.out.println("****欢迎使用xxx系统****"); System.out.println("****1.系统功能一*******"); System.out.println("****2.系统功能二*******"); System.out.println("****3.退出系统*********"); System.out.print("请输入功能选项:"); // 从键盘读入一个数选择要执行的功能 int select = sc.nextInt(); switch(select){ case 1: // 功能一相关代码 break; case 2: // 功能二相关代码 break; case 3: // 指定跳出外层的do-while循环,否则只能跳出当前的switch-case结构 break out; } // 判断条件一直为真,除非用户输入选项3退出系统,则使用break跳出。 }while(true); // 使用后关闭 sc.close(); } }
四、for循环
1. 循环结构
for(初始化部分;条件判断部分;迭代部分){ 循环体 }
2. 循环特点
for循环主要用于循环次数确定的情况,通常使用break直接跳出循环是由于已经完成了所需工作,终止剩余无用循环以提高程序运行效率。
- for循环的一个明显特点在于初始化部分,迭代部分的控制比较方便,可以完全在循环内部完成
- 初始化部分写在小括号中第一个位置,只会执行一次
- 如果在初始化部分声明一个新的变量,则该变量只能在循环内部使用
- 判断条件出现在小括号的中间位置,可以是布尔类型的变量或表达式,也可以直接省略使用break关键字手动跳出
- 迭代部分通常用于变量的控制,每次循环体结束后执行
- continue关键字可以用于所有的循环结构,作用是立即结束当前循环(跳过循环体的剩余部分内容,迭代部分依然会执行),进入下一次循环
3. 示例程序
- 计算整数1~10的加和
public static void main(String[] args){ // 定义一个整数类型变量,用于记录结果 int sum = 0; for(int i = 1;i <= 10;i++){ // 根据逻辑,将每次得到的值相加 sum += i; } // 输出计算结果 System.out.println(sum); }
- 输出整数0~100范围内的所有偶数
public static void main(String[] args){ for(int i = 0;i <= 100;i++){ // 判断当前数字的奇偶性,如果是奇数则跳过输出语句 if(i % 2 != 0){ // 如果是奇数,将跳过循环体剩余的部分,迭代部分不受影响 continue; } System.out.println(i); } // 输出计算结果 System.out.println(sum); }
五、死循环
死循环的出现是由于我们没有正确的指定循环的终止条件和控制相关的变量,导致判断条件部分一直为真,使得循环结构无法结束。但有些时候根据功能需要我们会手动先构造一个死循环,然后使用break来进行跳出,如:菜单程序,由用户来决定什么时候结束,进行循环的跳出。手动构建一个死循环十分简单,但是如果意外的出现死循环就需要优先检查条件判断部分以及相关变量的变化了。
1. while循环
while(true){ 循环体 }
2. do-while循环
do{ 循环体 }while(true)
3. for循环
// 是的,你没有看错,所有的部分都不需要填写,但是分号不能省略 for(;;){ 循环体 }