Bootstrap

C语言基础(五)【控制语句与循环(上)学习篇】


前言

C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,因此提供了多种控制语句和循环结构,用于控制程序的执行流程。


一、if - else 语句

1. if 语句的一般语法形式如下: \colorbox{PowderBlue}{1. if 语句的一般语法形式如下:} 1. if 语句的一般语法形式如下:

if ( 表达式 )
 语句1
else
 语句2

表达式成立(为真),则语句1执行,表达式不成立(为假),则语句执行表达式2。

在C语言中,0 为假,非 0 表示真,也就是表达式的结果如果是 0,则语句不执行,表达式的结果如果是不是 0,则语句执行。


2. if - else 语句一般的流程图 \colorbox{PowderBlue}{2. if - else 语句一般的流程图} 2. if - else 语句一般的流程图

在这里插入图片描述


3. 分支中包含多条语句 \colorbox{PowderBlue}{3. 分支中包含多条语句} 3. 分支中包含多条语句

(1). 默认在 if 和 else 语句中默认都只控制一条语句

示例1:

int a = 10;
int b = 20;
if (a < b)
	printf("%d < %d\n", a, b);
	printf("1\n");

输出结果:
在这里插入图片描述


但是当 b 为 5,a < b为假时,a < b 不成立,但第二条语句还是执行了
在这里插入图片描述
可以发现到不管是 a < b,a > b还是 a = b,1 都会打印在屏幕上

注意:这是因为 if 语句默认只能控制一条语句,就是 printf(“1\n”); ,if 语句为真,则打印 10 < 20,if语句为假,则不打印,对于 printf(“1\n”); 是独立存在的,不管 if 语句的条件的是真还是假,都会被执行。

如果要让 if 语句同时控制多条语句,就要使用 {} 将代码括起来,else 后也可以跟上大括号 {}。


示例2:

	int a = 10;
	int b = 5;
	if (a < b)
	{
		printf("%d < %d\n", a, b);
		printf("1\n");
	}

输出结果:
在这里插入图片描述
因为 a < b,if 里面的条件不成立,则大括号里的代码不执行。


4. 嵌套 if \colorbox{PowderBlue}{4. 嵌套 if} 4. 嵌套 if

在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断。

示例3:输入一个整数,如果是正数,再判断是奇数还是偶数。

int num = 0;
scanf("%d", &num);
if (num > 0)
{
	if (num % 2 == 0)
		printf("偶数\n");
	else
		printf("奇数\n");
}
else
{
	printf("负数\n");
}

输出结果1:
在这里插入图片描述


输出结果2:
在这里插入图片描述


 5. 悬空 else 问题 \colorbox{PowderBlue}{ 5. 悬空 else 问题}  5. 悬空 else 问题

如果有多个 if 和 else ,存在这样一条规则, else 总是跟最接近的 if 匹配

示例1:

int a = 0;
int b = 3;
if (a == 1)
	if (b == 3)
		printf("1\n");
else
		printf("2\n");

输出结果:
在这里插入图片描述
运行结果是:程序什么也没输出。


示例2:上面示例1可以理解为下面这段代码。

int a = 0;
int b = 2;
if (a == 1)
{
	if (b == 2)
		printf("1\n");
	else
		printf("2\n");
}

注意:这段代码中的 else 实际上与第二个 if 语句匹配,而不是第一个由于第一个 if 条件不成立(a 不等于 1),整个嵌套的 if - else 结构都不会执行,因此程序不会输出任何内容。
简而言之,由于第一个 if 条件为假,导致后面的 if - else 结构被跳过,所以程序不会打印任何东西。


6. if 语句多条件判断:if-else if-else结构的使用 \colorbox{PowderBlue}{6. if 语句多条件判断:if-else if-else结构的使用} 6. if 语句多条件判断:if-else if-else结构的使用

使用这个可以根据不同的条件执行不同的代码块。

示例1:

int a = 10;
int b = 20;
if (a < b) 
{
	// 如果 a < b 为真,则执行这里的代码
	printf("%d < %d\n", a, b);
}
else if (a > b) 
{
	// 如果 a < b 为假且 a > b 为真,则执行这里的代码
	printf("%d > %d\n", a, b);

}
else 
{
	// 如果 a < b 和 a > b 都为假,则执行这里的代码
	printf("%d = %d\n", a, b);

}

二、switch-case 语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。switch 语句是⼀种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它可以把多重的 else if 改成更易用、可读性更好的形式。

1. Switch 语句的语法形式 \colorbox{PowderBlue}{1. Switch 语句的语法形式} 1. Switch 语句的语法形式

switch (expression) {
    // 如果 expression 等于 value1,执行这里的代码
    case value1: statement1
        break;
    // 如果 expression等于 value2,执行这里的代码
    case value2: statement2
        break;
    // ...可以有多个case
    // 如果 expression 不等于任何 case 的值,执行这里的代码
    default: statement3
}

上面代码根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。


注意:1. switch 后的 expression 必须是整型表达式。
2. case 后的值,必须是整形常量表达式。
3. case 和后边的数字之间必须有空格。
4. 每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个 switch语句。


2. Switch 语句的流程图 \colorbox{PowderBlue}{2. Switch 语句的流程图} 2. Switch 语句的流程图
在这里插入图片描述


3. Switch 语句中的 break 和 default 的作用 \colorbox{PowderBlue}{3. Switch 语句中的 break 和 default 的作用} 3. Switch 语句中的 break  default 的作用

  1. switch 中的 break(下面会讲解 break 语句的作用)。

示例1:输入任意一个整数值,计算除 3 之后的余数。

int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
	printf("整除,余数为0\n");
	break;
case 1:
	printf("余数是1\n");
	break;
case 2:
	printf("余数是2\n");
	break;
}

输出结果1:
在这里插入图片描述


在这里插入图片描述


如果去掉 case 语句中的 break。

示例2:

int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
	printf("整除,余数为0\n");
case 1:
	printf("余数是1\n");
case 2:
	printf("余数是2\n");
}

输出结果2:
在这里插入图片描述


注意:switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。


  1. switch 中的 default

在使用 switch 语句的时候,可能会遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候就要不得不做处理,在 switch 语句中加入 default 子句。

示例1:输入星期,输出是工作日还是休息日。

int day = 0;
scanf("%d", &day);

switch (day)
{
    case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误");
		break;
}

输出结果:
在这里插入图片描述


注意:在 switch 语句中 case 语句和 default 语句其实是没有顺序要求的,只要确保当前写的顺序是可以满足实际需求的就可以。不过通常是把 default 子句放在最后处理的。


三、while 循环

1. while 循环的语法形式 \colorbox{PowderBlue}{1. while 循环的语法形式} 1. while 循环的语法形式

while (表达式) {
    // 循环体
    // 这是一段代码块,只要条件(表达式)为真,就会不断执行
}

这里的表达式是一个布尔表达式,它在每次循环开始之前都会被检查。如果表达式的值为真(即非零),循环体中的代码就会执行。循环体执行完毕后,控制流回到 while语句,再次检查条件。这个过程会一直重复,直到条件变为假(零)或一直循环下去。


2. while 循环的流程图 \colorbox{PowderBlue}{2. while 循环的流程图} 2. while 循环的流程图
在这里插入图片描述


3. while 循环的实践 \colorbox{PowderBlue}{3. while 循环的实践} 3. while 循环的实践

示例:在屏幕上打印1~10的值。

int i = 1;
while (i <= 10)    // 当 i 的值小于或等于 10,循环就会继续执行。
{
	printf("%d ", i);
	i = i + 1;
}

输出结果:
在这里插入图片描述


注意:while 循环结构比较适合于那些需要在不确定次数内重复执行某段代码的场景。


四、for 循环

1. for 循环的语法形式 \colorbox{PowderBlue}{1. for 循环的语法形式} 1. for 循环的语法形式

for (初始化表达式;条件表达式;更新表达式) {
    // 循环体
    // 这是一段代码块,只要条件表达式为真,就会不断执行
}

初始化表达式: 用于循环变量的初始化。
条件表达式 :用于循环结束条件的判断。
更新表达式 :用于循环变量的调整。

循环开始时,首先初始化循环变量(初始化表达式)。然后不断检查条件(条件表达式),若条件为真(非0),则执行循环体,接着更新循环变量(更新表达式),并重复此过程。若条件为假(0),则循环终止。

简而言之,循环变量仅初始化一次,之后循环根据条件持续执行,直至条件不再满足。


2. for 循环的流程图 \colorbox{PowderBlue}{2. for 循环的流程图} 2. for 循环的流程图
在这里插入图片描述


3. for 循环的实践 \colorbox{PowderBlue}{3. for 循环的实践} 3. for 循环的实践

示例:在屏幕上打印1~10的值。

	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}

输出结果:
在这里插入图片描述


注意: for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分比较集中,便于代码的维护。如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。


五、do - while 循环

在循环语句中 do while 语句的使用较少。

1. do - while 循环的语法形式 \colorbox{PowderBlue}{1. do - while 循环的语法形式} 1. do - while 循环的语法形式

do {
    // 循环体
    // 这是一段代码块,至少执行一次
} while (条件表达式);

while 和 for 循环先判断条件,满足则执行循环体,不满足则退出循环。do-while 循环先执行循环体,然后判断条件,条件为真则重复循环,为假则退出循环。

简而言之,while 和 for 是“先判断后执行”,而 do-while 是“先执行后判断”。


2. do - while 循环的流程图 \colorbox{PowderBlue}{2. do - while 循环的流程图} 2. do - while 循环的流程图

在这里插入图片描述


3. do - while 循环的实践 \colorbox{PowderBlue}{3. do - while 循环的实践} 3. do - while 循环的实践

示例:上打印1~10的值。

int i = 1;
do
{
	printf("%d ", i);
	i = i + 1;
} while (i <= 10);

输出结果:
在这里插入图片描述


六、break 语句

在C语言中,break 语句是一种控制语句,用于立即终止最近的 switch 语句或循环(while、do…while、for)的执行,并跳出该结构。

1. 终止循环 \colorbox{PowderBlue}{1. 终止循环} 1. 终止循环

在 while、do…while 或 for 循环中,break 语句可以提前终止循环的执行。这通常在满足某个特定条件时发生,该条件表明继续迭代已经没有必要或不再安全。
示例:

for (int i = 0; i < 5; i++) 
{
	if (i == 2) 
	{
		break; // 当 i 等于 2 时终止循环
	}
	printf("i 的值是:%d\n", i);
}

输出结果:
在这里插入图片描述


2. 终止 switch 语句 \colorbox{PowderBlue}{2. 终止 switch 语句} 2. 终止 switch 语句

在 switch 语句中,break 语句用于终止当前 case 块的执行,并跳出整个 switch 结构。(上面有示例)

注意:break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执。


七、continue 语句

在C语言中,continue 语句用于跳过当前循环迭代的剩余部分,并立即开始下一次迭代。continue 语句只能在 while、do…while 或 for 循环中使用,它不能在switch语句中使用。

1. continue 语句的基本用法 \colorbox{PowderBlue}{1. continue 语句的基本用法} 1. continue 语句的基本用法

continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。

示例:

while (条件) {
	// 循环体的一部分
	if (某个条件) {
		continue;   // 当某个条件满足时,跳过本次循环的剩余部分
	}
	// 循环体的其余部分
}

1. continue 语句的特点 \colorbox{PowderBlue}{1. continue 语句的特点} 1. continue 语句的特点

1.跳过当前迭代的剩余代码:当continue语句被执行时,它会立即结束当前迭代,并开始下一次迭代。这意味着continue语句之后的代码将不会被执行。

2.用于条件过滤:continue 语句常用于过滤掉不满足特定条件的迭代,只处理满足条件的情况。

示例:打印 0 - 10 的奇数

for (int i = 0; i <= 10; i++) 
{
	if (i % 2 == 0) 
	{
		continue;    // 跳过偶数,只处理奇数
	}
	printf("奇数:%d\n", i);
}

输出结果:
在这里插入图片描述


注意:1. break 语句用于完全终止循环的执行,跳出循环体。
2. continue 语句只跳过当前迭代的剩余部分,继续执行下一次迭代。


八、go to 语句

C语言提供了一种特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同一个函数内跳转到设置好的标号处。

1. go to 语句的基本用法 \colorbox{PowderBlue}{1. go to 语句的基本用法} 1. go to 语句的基本用法

goto 标签名;

示例:

    int i;
    for (i = 0; i < 5; i++) 
    {
        if (i == 3) 
        {
            goto end; // 当 i 等于 3 时,跳转到 end 标签处
        }
        printf("i 的值是:%d\n", i);
    }

end:
    printf("循环结束,i 的值是:%d\n", i);

输出结果:
在这里插入图片描述

在这个例子中,当变量 i 的值等于3时,go to 语句会将控制流转移到 end: 标签处,跳过循环的剩余部分,并直接打印 “循环结束,i 的值是:3”。


注意:1. 代码可读性:过度使用 go to 语句可能会使得代码的逻辑变得难以跟踪和理解,从而降低代码的可读性。
2. 代码维护性:使用 goto 语句可能会导致代码维护困难,因为它打破了程序执行的自然流程。
3. 但在多层循环的代码中,如果想快速跳出使用 goto 就非常的方便了。


总结

本文章主要介绍了 if - else 语句,switch - case 语句,while 循环,for 循环,do -while 循环,break, continue 和 goto 语句等。这些控制语句和循环是 C 语言编程的基础,掌握它们对于编写结构清晰、逻辑明确的程序至关重要。

;