Skip to content

控制结构

在程序中,程序运行的流程控制决定程序是如何执行的,控制结构主要有三大流程控制语句

顺序控制

程序从上到下逐行执行,中间没有任何判断和跳转,顺序控制是程序默认的控制语句


分支控制

if else分支

分支控制是让程序有选择(根据判断进行选择)的执行,分支控制有三种形式:

  • 单分支

    基本语法:

    java
    if(条件表达式) {
        执行代码块;
    }

    当条件表达式为true时,就会执行{}的代码,如果{}中只有一条语句,可以不使用{}进行包裹

  • 双分支

    基本语法:

    java
    if(条件表达式) {
        执行代码块1;
    }
    else {
        执行代码块2;
    }

    当条件表达式为true时,执行代码块1,否则执行代码块2

  • 多分支

    基本语法:

    java
    if(条件表达式1) {
        执行代码块1;
    }
    else if(条件表达式2) {
        执行代码块2;
    }
    ...
    else {
        执行代码块n;
    }

    当对应的表达式为true时,执行对应的代码块,如果条件表达式都不成立,则执行代码块n

    多分支可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有

嵌套分支:在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支结构称为内层分支,外面的分支结构称为外层分支,但是建议分支不要超过3层,因为可读性不好

基本语法:

java
if(条件表达式1) {
    if(条件表达式2) {
        执行代码块2;
    }
    else {
        执行代码块3;
    }
}

switch分支

基本语法:

java
switch(表达式) {
    case 常量1:
        语句块1;
        break;
    case 常量2:
        语句块2;
        break;
    default:
        default语句块;
        break;
}

如果表达式的结果和case常量1匹配,就执行语句块1,如果没有匹配,就继续和case常量2进行匹配,以此类推,如果一个都没有匹配上,执行default语句块

break表示退出switch语句

如果执行完一个case语句块后,没有执行break语句,那么不会退出switch语句,会继续进行后面case的语句块,不需要进行匹配,会直接穿透执行,同时,如果前面没有break的话还会执行default的语句块

对于default匹配项,有没有break是无所谓的,执行了default语句块都会退出switch语句

注意细节:

  • 表达式的数据类型,应该和case后面的常量类型一致,或者是可以自动转换成可以相互比较的类型(如输入的是字符,而常量是int

  • switch(表达式)中表达式的返回值必须是

    java
    double c = 1.1;
    switch(c) {   // 报错double类型不能使用
        case 1.1:
            ...
    }
  • case句子中的值必须是常量(具体的值),或者是计算表达式(得到的也是常量),不能是变量

  • default句子是可选的,当没有匹配的case时,执行default

  • break语句用来执行完一个case分支后使程序跳出seitch语句块,如果没有写break,程序会顺序执行到switch结尾

ifswitch使用的选择

  • 如果判断的具体数值不多,而且符合(byteshortintcharenumString)这六种类型,建议使用switch语句
  • 其他情况,对区间判断,对结果为boolean类型判断,使用if语句,if语句的使用范围更广

循环控制

循环控制就是让代码可以循环的执行

for循环

基本语法:

java
for(循环变量初始化;循环条件;循环变量迭代) {
    循环操作(语句);
}

如果循环条件为true,就会执行一次循环操作

注意事项:

  • 循环条件是返回一个布尔值的表达式

  • for(;循环条件;)中的初始化和变量迭代可以其它地方,但是两边的分号不能省略

    java
    int i = 1;
    for(;i <= 10;) {
        循环操作(语句);
        i++;
    }
  • 循环的初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开

    java
    int count = 3;
    for(int i = 0, j = 0; i < count; i++, j += 2) {
        System.out.println(i, j);     // 0,0   1,2   2,4
    }

    编程思想:化繁为简(将复杂的需求先拆分一个个简单的需求,逐步完成),先死后活(先考虑固定的值,再转成可以灵活变化的值)

while循环

基本语法:

java
循环变量初始化;
while(循环条件) {
    循环体(语句);
    循环变量迭代;
}

注意事项:

  • 循环条件是返回一个布尔值的表达式
  • while循环是先判断,再执行语句

do..while循环

基本语法:

java
循环变量初始化;
do {
    循环体(语句);
    循环变量迭代;
}while(循环条件);

注意事项:

  • do..while循环是先执行,再判断,也就是说至少会执行一次

多重循环控制

将一个循环放在另一个循环体内,就形成了嵌套循环,一般建议使用两层即可,最多不要超过三层,否则代码可读性大大降低

实际上,嵌套循环就是把内层循环当外层循环的循环体,当只有内存循环的循环条件为false时,才会完全跳出内层循环,才可以结束外层的当次循环,开始外层的下一次循环

设置外层循环次数为m次,内层循环为n次,则内层循环体一共执行m*n

java
// 打印空心金字塔
public class HollowPyramids {
	public static void main(String[] args) {
		int totalLevel = 5;
		for(int i = 1; i <= totalLevel; i++) {
			for(int k = 1; k <= totalLevel - i; k++) {
				System.out.print(" ");
			}
			for(int j = 1; j <= 2 * i - 1; j++) {
				if (j == 1 || j == 2 * i - 1 || i == totalLevel) {
					System.out.print("*");
				}
				else {
					System.out.print(" ");
				}
			}
			System.out.println(" ");
		}
	}
}

System.out.print("*");表示输出后不换行

System.out.println("*");表示输出后换行

break关键字

在循环语句的流程控制中,我们可以使用break语句来终止某个语句块的执行

基本语法:

java
{
    ...
    break;
}

执行到break时跳出整个循环,用于提前终止循环

java
for(int i = 0; i < 10; i++) {
    if(i == 3) {
        break;
    }
    System.out.print(i);
}
// 结果输出  012

break语句出现在多层嵌套语句块中时,可以通过标签指明要终止的是哪一层语句块

java
label1: {   ......
label2:		{   ......
label3:			{   ......
    				break label2;
                 	......
				}    
			}    
        }

break语句可以指定退出到哪层

label1是标签,名称由程序员指定,break后指定到哪个label,就退出到哪里

如果没有指定break,则默认退出最近的循环体

在实际开发中,尽量不要使用标签,会导致可读性变差

continue关键字

continue语句用于结束本次循环,继续执行下一次循环

基本语法:

java
{
    ...   
    continue;
    // 执行了continue语句,本次循环后面的内容就不执行了
}

如果continue语句出现在多层嵌套的循环语句体中,可以通过标签指明要跳出哪一层循环

return关键字

return通常与方法函数一起使用,表示跳出所在的方法,如果return写在main方法中,会退出主程序

Released under the MIT License.