c语言小课堂-continue 与 break

今天,我们将一起探索两个在循环中扮演“指挥家”角色的关键字——continuebreak。它们就像是循环中的“暂停键”和“终止键”,能够灵活地控制程序的执行流程,让你的代码更加高效和优雅。

一、知识点讲解

1. continuebreak 是什么?

在C语言中,forwhiledo-while 循环是程序重复执行某段代码的强大工具。然而,有时我们希望在循环执行过程中,根据特定条件跳过某些迭代,或者提前结束整个循环。这时,continuebreak 就派上用场了。

  • continue 关键字

    • 作用continue 的作用是跳过当前循环中剩余的语句,直接进入下一次循环的判断条件(或更新表达式)。它并非跳出整个循环,而是跳过当前循环体的剩余部分,开始下一轮循环。
    • 比喻:你可以把 continue 想象成一个“快进”按钮。当程序遇到 continue 时,它会说:“嘿,这一轮剩下的部分我不想看了,直接跳到下一轮的开头!”
  • break 关键字

    • 作用break 的作用是立即终止当前的循环(forwhiledo-while),并跳出循环体,程序继续执行循环体后面的语句。
    • 比喻break 则更像一个“紧急刹车”或“退出”按钮。当程序遇到 break 时,它会说:“行了,到此为止,这个循环我不想再执行了,直接出去!”

2. 何时用,为什么用?

理解 continuebreak 的使用场景至关重要。它们是实现复杂逻辑、优化程序效率的利器。

特性 continue break
作用 终止当前循环的本次迭代,进入下一次迭代 终止整个循环,跳出循环体
影响 仅影响当前迭代,循环可能继续执行后续迭代 立即中止整个循环,循环不再执行
位置 只能用于循环语句中 可用于循环语句和 switch 语句中
目的 跳过不符合条件的某些步骤,继续执行后续符合条件的操作 在满足特定条件时,提前结束不必要的循环计算

什么时候用?

  • 使用 continue 的场景:

    • 跳过无效数据或特殊情况: 当你遍历一组数据时,如果某个数据不符合处理条件,但你又不想因此停止整个遍历,就可以使用 continue 跳过这个数据,继续处理下一个。
    • 优化循环性能: 避免对不满足特定条件的元素进行后续的复杂计算,从而提高效率。
    • 简化逻辑: 当某个条件为真时,后续代码不应执行,使用 continue 可以避免多层嵌套的 if-else 结构。
    • 例如: 在计算一组数的平均值时,如果遇到负数,我们可能希望跳过它,只计算正数的平均值。
  • 使用 break 的场景:

    • 找到目标后立即停止: 当你在循环中搜索某个特定值或条件时,一旦找到,就没有必要继续遍历下去,break 可以让你立即退出循环。
    • 错误处理或异常退出: 当循环过程中发生某个错误或达到某种不可恢复的状态时,可以使用 break 终止循环,进行错误处理。
    • 用户输入退出: 在交互式程序中,用户输入特定指令(如“quit”)时,可以用来退出输入循环。
    • 例如: 在一个数组中查找某个元素,一旦找到,即可使用 break 退出循环。

为什么用?

  • 提高效率: 避免不必要的计算和迭代,让程序更快地完成任务。
  • 简化代码逻辑: 避免深层嵌套的 if-else 结构,使代码更易读、更易维护。
  • 精确控制: 赋予程序员对循环执行流程更精细的控制能力,以应对各种复杂的业务需求。

3. 怎么用?

让我们通过实际的C语言代码示例来感受 continuebreak 的魔力。

示例一:continue 的应用——筛选偶数

假设我们要打印1到10之间所有的偶数。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main() {
printf("打印1到10之间的偶数:\n");
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) { // 如果是奇数
continue; // 跳过本次循环的剩余部分,直接进入下一次迭代
}
printf("%d ", i); // 只有偶数才能执行到这里
}
printf("\n");
return 0;
}

运行结果:

1
2
打印1到10之间的偶数:
2 4 6 8 10

代码解析:
i 是奇数时(如1, 3, 5…),i % 2 != 0 条件为真,continue 语句被执行,程序会跳过 printf("%d ", i); 这一行,直接进入 for 循环的下一次迭代(即 i++)。这样,只有当 i 是偶数时,printf 语句才会被执行。

示例二:break 的应用——查找特定数字

假设我们要在一个循环中查找数字5,一旦找到就停止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
printf("查找数字5:\n");
for (int i = 1; i <= 10; i++) {
printf("当前检查数字:%d\n", i);
if (i == 5) { // 如果找到数字5
printf("找到了数字5!\n");
break; // 立即终止整个循环
}
}
printf("循环已结束。\n"); // 循环结束后执行
return 0;
}

运行结果:

1
2
3
4
5
6
7
8
查找数字5:
当前检查数字:1
当前检查数字:2
当前检查数字:3
当前检查数字:4
当前检查数字:5
找到了数字5!
循环已结束。

代码解析:
i 达到5时,i == 5 条件为真,break 语句被执行。此时,整个 for 循环会立即停止,程序会跳出循环体,继续执行 printf("循环已结束。\n");。你会发现,数字6到10并没有被打印出来,因为循环在找到5之后就被“刹车”了。

示例三:continuebreakwhile 循环中的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main() {
int sum = 0;
int num;

printf("请输入整数(输入负数结束,输入0跳过):\n");

while (1) { // 无限循环
printf("请输入一个整数:");
scanf("%d", &num);

if (num < 0) { // 如果输入负数,退出循环
printf("检测到负数,程序结束。\n");
break;
}

if (num == 0) { // 如果输入0,跳过本次累加,继续下一次输入
printf("输入0,跳过本次累加。\n");
continue;
}

sum += num; // 累加非0非负数
printf("当前总和:%d\n", sum);
}

printf("最终总和:%d\n", sum);
return 0;
}

运行结果示例:

1
2
3
4
5
6
请输入整数(输入负数结束,输入0跳过):
请输入一个整数:10
当前总和:10
请输入一个整数:-5
检测到负数,程序结束。
最终总和:10

或者

1
2
3
4
5
6
7
8
9
10
请输入整数(输入负数结束,输入0跳过):
请输入一个整数:5
当前总和:5
请输入一个整数:0
输入0,跳过本次累加。
请输入一个整数:8
当前总和:13
请输入一个整数:-1
检测到负数,程序结束。
最终总和:13

代码解析:
这是一个简单的交互式程序,用于累加用户输入的正整数。

  • 当用户输入负数时,break 语句会立即终止 while 循环,程序跳出循环。
  • 当用户输入0时,continue 语句会跳过本次循环中 sum += num; 的执行,直接进入下一次 while 循环的判断条件(while(1) 始终为真),提示用户再次输入。
  • 只有当输入非0非负数时,数字才会被累加到 sum 中。

通过这些例子,相信你已经对 continuebreak 的用法有了清晰的认识。它们是循环控制的两个重要工具,合理运用能让你的程序更加灵活和强大。

二、典型习题

1. 选择题

以下关于 continuebreak 关键字的描述,哪一项是正确的?

  • A. break 语句用于跳出当前循环的本次迭代,而 continue 语句用于跳出整个循环。
  • B. continue 语句只能用于 for 循环,而 break 语句只能用于 while 循环。
  • C. break 语句可以用于 switch 语句和循环语句,而 continue 语句只能用于循环语句。
  • D. continue 语句和 break 语句都必须在 if 语句内部使用。

2. 判断题

在C语言中,break 语句总是跳出它所在的最近一层循环。

  • A. 对
  • B. 错

3. 填空题

在循环中,当需要跳过当前循环的剩余部分,直接进入下一次循环时,应使用关键字 _________;当需要立即终止整个循环,跳出循环体时,应使用关键字 _________

4. 编程题(难度:易)

请编写一个C语言程序,使用 for 循环从1遍历到20。

  • 如果当前数字是3的倍数,则跳过本次循环,不打印该数字。
  • 如果当前数字大于15,则立即终止循环。
  • 否则,打印该数字。

5. 编程题(难度:中)

编写一个C语言程序,要求用户不断输入正整数,直到用户输入负数为止。

  • 程序计算并打印所有输入的偶数的和。
  • 如果用户输入了0,则跳过本次输入,不将其计入和中。
  • 如果用户输入的数大于100,则提示“数字过大,请重新输入”,并要求用户再次输入(不计入当前输入,不累加,不退出)。

三、习题讲解

1. 选择题

以下关于 continuebreak 关键字的描述,哪一项是正确的?

  • A. break 语句用于跳出当前循环的本次迭代,而 continue 语句用于跳出整个循环。
  • B. continue 语句只能用于 for 循环,而 break 语句只能用于 while 循环。
  • C. break 语句可以用于 switch 语句和循环语句,而 continue 语句只能用于循环语句。
  • D. continue 语句和 break 语句都必须在 if 语句内部使用。

答案:C

解析:

  • A选项错误:break 用于跳出整个循环,continue 用于跳出当前迭代。
  • B选项错误:continuebreak 都可以用于 forwhiledo-while 循环。
  • C选项正确:break 除了循环,还常用于 switch 语句中跳出 case 分支。continue 仅用于循环。
  • D选项错误:continuebreak 不一定非要在 if 语句内部使用,它们可以在循环体内的任何位置,但通常会配合条件判断使用。

2. 判断题

在C语言中,break 语句总是跳出它所在的最近一层循环。

  • A. 对
  • B. 错

答案:A

解析:
break 语句的特性是它只会终止它所直接包含的循环(或 switch 语句)。如果存在多层嵌套循环,break 只会跳出它所在的最内层循环,而不会影响外层循环的执行。

3. 填空题

在循环中,当需要跳过当前循环的剩余部分,直接进入下一次循环时,应使用关键字 _continue_;当需要立即终止整个循环,跳出循环体时,应使用关键字 _break_

答案:continuebreak

解析:
这是对 continuebreak 基本功能的直接考察。continue 负责“跳过本次”,break 负责“跳出全部”。

4. 编程题(难度:易)

请编写一个C语言程序,使用 for 循环从1遍历到20。

  • 如果当前数字是3的倍数,则跳过本次循环,不打印该数字。
  • 如果当前数字大于15,则立即终止循环。
  • 否则,打印该数字。

参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main() {
printf("满足条件的数字:\n");
for (int i = 1; i <= 20; i++) {
if (i > 15) { // 如果当前数字大于15,立即终止循环
break;
}
if (i % 3 == 0) { // 如果是3的倍数,跳过本次循环
continue;
}
printf("%d ", i); // 打印符合条件的数字
}
printf("\n");
return 0;
}

运行结果:

1
2
满足条件的数字:
1 2 4 5 7 8 10 11 13 14

解析:

  • if (i > 15) { break; }:这行代码放在循环体的最前面是关键。它确保一旦 i 超过15,循环会立即停止,后续的 continueprintf 都不会被执行,从而满足“如果当前数字大于15,则立即终止循环”的要求。
  • if (i % 3 == 0) { continue; }:这行代码检查当前数字是否是3的倍数。如果是,continue 会跳过 printf 语句,直接进入下一次循环的迭代。
  • printf("%d ", i);:只有当数字既不大于15,也不是3的倍数时,才会执行到这一步,从而打印出符合条件的数字。

5. 编程题(难度:中)

编写一个C语言程序,要求用户不断输入正整数,直到用户输入负数为止。

  • 程序计算并打印所有输入的偶数的和。
  • 如果用户输入了0,则跳过本次输入,不将其计入和中。
  • 如果用户输入的数大于100,则提示“数字过大,请重新输入”,并要求用户再次输入(不计入当前输入,不累加,不退出)。

参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>

int main() {
int num;
int even_sum = 0;

printf("请输入正整数(输入负数结束,输入0跳过,大于100重新输入):\n");

while (1) { // 使用无限循环,通过break退出
printf("请输入一个整数:");
scanf("%d", &num);

if (num < 0) { // 条件一:输入负数,退出循环
printf("检测到负数,程序结束。\n");
break;
}

if (num == 0) { // 条件二:输入0,跳过本次输入
printf("输入0,跳过本次累加。\n");
continue;
}

if (num > 100) { // 条件三:输入大于100,提示并重新输入
printf("数字过大(%d),请重新输入。\n", num);
continue; // 跳过本次循环的剩余部分,重新要求输入
}

// 只有非负、非0、非大于100的数才会执行到这里
if (num % 2 == 0) { // 如果是偶数
even_sum += num;
printf("当前偶数和:%d\n", even_sum);
} else {
printf("当前输入为奇数,不计入偶数和。\n");
}
}

printf("程序结束。所有输入的偶数的总和为:%d\n", even_sum);
return 0;
}

运行结果示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
请输入正整数(输入负数结束,输入0跳过,大于100重新输入):
请输入一个整数:10
当前偶数和:10
请输入一个整数:5
当前输入为奇数,不计入偶数和。
请输入一个整数:0
输入0,跳过本次累加。
请输入一个整数:120
数字过大(120),请重新输入。
请输入一个整数:20
当前偶数和:30
请输入一个整数:-1
检测到负数,程序结束。
程序结束。所有输入的偶数的总和为:30

解析:

  • while(1):采用无限循环结构,因为退出条件(输入负数)可能发生在循环的任何阶段。
  • if (num < 0) { break; }:这是最优先的退出条件,一旦用户输入负数,程序立即终止。
  • if (num == 0) { continue; }:如果输入0,直接跳过本次循环的剩余逻辑(包括偶数判断和累加),进入下一次输入。
  • if (num > 100) { continue; }:如果输入大于100,同样跳过本次循环的剩余逻辑,并提示用户重新输入。这确保了不合法的输入不会被处理,也不会影响后续的输入要求。
  • if (num % 2 == 0) { ... }:只有经过以上三层条件筛选后的有效数字,才会进入到偶数判断和累加的逻辑。奇数会被明确提示但不累加。

continuebreak 的巧妙运用,使得这个程序能够优雅地处理多种复杂的输入情况,体现了良好的程序控制流设计。


生活中的每一次选择,都像编程中的 if 语句,决定我们是否继续,或选择另一条路径。而 continuebreak,便是这选择中的小小哲思:有时,我们只需跳过眼前的喧嚣,等待下一刻的宁静;有时,则需果断抽身,终止一段不再有意义的循环,去迎接新的开始。它们不只关乎代码,更关乎在纷繁世界里,如何懂得取舍,如何不被无尽的重复所困,去寻觅那真正值得驻足的风景。