continue 是什么?
continue 是一个控制流语句,它的作用是立即终止当前正在执行的循环体的剩余部分,并直接跳转到循环条件判断部分,准备进行下一次循环。

你可以把它想象成在循环执行过程中说:“这次就到这里吧,直接开始下一次循环,不要再执行下面的代码了。”
工作原理
continue 语句只能在 for、while 和 do-while 循环内部使用。
它的工作流程如下:
- 执行循环体:程序从循环的开头开始执行。
- 遇到
continue:在循环体的任何位置,如果执行到了continue语句... - 立即跳转:程序会立即跳过当前循环体中
continue语句之后的所有代码。 - 进入下一次迭代:程序直接跳转到循环的“更新”部分(对于
for循环)或“条件判断”部分(对于while和do-while循环),开始下一次循环的执行。
重要区别:continue vs break
这是一个非常容易混淆的点,必须清晰区分:
| 语句 | 作用 | 影响范围 |
|---|---|---|
break |
完全终止整个循环,循环不再执行,程序 flow 跳转到循环语句的下一条语句。 | 跳出整个循环 |
continue |
跳过本次循环的剩余部分,直接进入下一次循环。 | 跳入下一次循环 |
在不同循环中的具体用法
a) 在 for 循环中
在 for 循环中,continue 会跳过循环体剩余的代码,然后直接执行 for 循环的 第三个表达式(即“更新”部分),然后再进行条件判断。
示例代码:
#include <stdio.h>
int main() {
printf("--- 在 for 循环中使用 continue ---\n");
for (int i = 0; i < 10; i++) {
// i 是 3 或 5,就跳过本次循环的剩余部分
if (i == 3 || i == 5) {
continue; // 跳转到 i++ 的部分
}
printf("i = %d\n", i);
}
return 0;
}
执行结果:
--- 在 for 循环中使用 continue ---
i = 0
i = 1
i = 2
i = 4 // i=3 时被跳过
i = 6 // i=5 时被跳过
i = 7
i = 8
i = 9
分析:
当 i 的值变为 3 时,if 条件成立,continue 被执行,程序立即跳过 printf 语句,直接执行 for 循环的 i++,i 变为 4,进入下一次循环。i=5 的情况同理。
b) 在 while 循环中
在 while 循环中,continue 会跳过循环体剩余的代码,然后直接跳转到循环的条件判断部分。
⚠️ 潜在陷阱:
如果在 while 循环中,continue 的判断条件没有包含能够改变循环变量的语句,就可能会导致无限循环。
示例代码(正确用法):
#include <stdio.h>
int main() {
int i = 0;
printf("--- 在 while 循环中使用 continue ---\n");
while (i < 10) {
if (i == 3 || i == 5) {
i++; // 必须在这里递增,否则会死循环
continue;
}
printf("i = %d\n", i);
i++; // 正常递增
}
return 0;
}
分析:
如果去掉 if 语句块里的 i++,当 i 变为 3 时,continue 被执行,程序跳到 while (i < 10) 判断,因为 i 仍然是 3,条件永远为真,循环永远不会结束,变成死循环。
c) 在 do-while 循环中
do-while 的工作方式与 while 类似。continue 会跳过循环体剩余的代码,然后直接跳转到条件判断部分。
⚠️ 同样需要注意陷阱,确保循环变量能被更新以避免无限循环。
典型应用场景
continue 最常见的用途是过滤或跳过不符合特定条件的迭代。
场景1:跳过偶数
#include <stdio.h>
int main() {
printf("--- 打印 1 到 10 之间的奇数 ---\n");
for (int i = 1; i <= 10; i++) {
// i 能被 2 整除(即 i 是偶数),就跳过
if (i % 2 == 0) {
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
输出:
--- 打印 1 到 10 之间的奇数 ---
1 3 5 7 9
场景2:处理数组时跳过无效数据
假设你有一个整数数组,你需要对其中所有正数进行求和,遇到负数或零就忽略。
#include <stdio.h>
int main() {
int numbers[] = {10, -5, 20, 0, 15, -8, 30};
int sum = 0;
int count = sizeof(numbers) / sizeof(numbers[0]);
printf("--- 对数组中的正数求和 ---\n");
for (int i = 0; i < count; i++) {
// 如果数字小于等于 0,就跳过本次循环
if (numbers[i] <= 0) {
continue;
}
// 只有正数才会执行到这里
sum += numbers[i];
printf("累加 %d, 当前和: %d\n", numbers[i], sum);
}
printf("\n最终的正数总和为: %d\n", sum);
return 0;
}
输出:
--- 对数组中的正数求和 ---
累加 10, 当前和: 10
累加 20, 当前和: 30
累加 15, 当前和: 45
累加 30, 当前和: 75
最终的正数总和为: 75
场景3:多层循环中的 continue
continue 默认只作用于它所在的最近的一层循环,如果你想在嵌套循环中跳过外层循环的某次迭代,你需要使用 continue 的带标签形式。
语法:
label:
for (...) {
// ...
if (condition) {
continue label; // 跳转到 label 标记的循环的下一次迭代
}
// ...
}
示例代码:
#include <stdio.h>
int main() {
// 外层循环控制行
for (int i = 1; i <= 3; i++) {
// 内层循环控制列
for (int j = 1; j <= 3; j++) {
// i 和 j 相等,就跳过外层循环的本次迭代
if (i == j) {
continue; // 这里的 continue 只作用于内层循环,效果等同于 break
// 如果想作用于外层循环,需要使用标签
}
printf("i = %d, j = %d\n", i, j);
}
}
printf("\n--- 使用标签的 continue ---\n");
outer_loop: // 定义一个标签
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i == j) {
continue outer_loop; // 跳转到 outer_loop 标记的循环,即外层循环的下一次迭代
}
printf("i = %d, j = %d\n", i, j);
}
}
return 0;
}
输出分析:
第一个不带标签的 continue 只会结束内层循环的本次迭代,所以当 i=j 时,它只是跳过了 printf,内层循环会继续 j++。
第二个带标签的 continue outer_loop,当 i=j 时,它会直接跳转到外层循环的 i++ 部分,内层循环完全终止。
总结与最佳实践
| 特性 | 描述 |
|---|---|
| 作用 | 跳过当前循环的剩余代码,直接进入下一次循环迭代。 |
| 位置 | 只能在 for, while, do-while 循环内部使用。 |
与 break 的区别 |
break 是跳出整个循环,continue 是跳入下一次循环。 |
在 while/do-while 中的陷阱 |
确保在 continue 之前或通过 continue 的逻辑能更新循环控制变量,否则可能导致无限循环。 |
| 嵌套循环 | 默认只作用于最近的一层循环,使用带标签的 continue 可以控制外层循环。 |
| 代码风格 | continue 可以使代码更清晰,尤其是在复杂的条件判断中,但过度使用可能会使逻辑变得难以跟踪,应适度使用。 |
核心思想:
continue 是一个强大的工具,用于实现“如果发生某种情况,就忽略剩下的处理,直接进入下一次循环”的逻辑,正确理解和使用它,能让你的 C 语言代码更加简洁和高效。
