continue 是什么?
continue 是一个控制流语句,它的作用是立即终止当前正在执行的循环体的剩余部分,并直接跳转到下一次循环的条件判断。
当 continue 语句在循环中被执行时,循环体中 continue 之后的代码将不会被执行,程序会直接开始下一次循环的迭代。
continue 的工作原理
continue 只能在 for、while 和 do-while 循环内部使用,它不能在 switch 语句外使用(尽管可以在 switch 内部使用,但需要配合循环)。
工作流程图
graph TD
A[循环开始] --> B{执行循环体代码};
B --> C{是否遇到 continue?};
C -- 是 --> D[跳过本次循环剩余代码];
D --> E[进入下一次循环迭代];
C -- 否 --> F{执行循环体剩余代码};
F --> E;
E --> G{循环条件是否成立?};
G -- 是 --> B;
G -- 否 --> H[循环结束];
continue 在不同循环中的具体行为
a) 在 for 循环中
在 for 循环中,执行 continue 后,程序会:
- 立即跳转到
for循环的增量表达式(increment_expression,即for语句中的第三个部分)。 - 执行增量表达式。
- 然后跳转到条件表达式(
condition_expression,即for语句中的第二个部分)进行判断。 - 如果条件为真,则开始下一次循环。
示例:打印 1 到 10 之间除了 5 以外的所有数字
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
// 当 i 等于 5 时,跳过本次循环的剩余代码(即 printf)
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
执行过程:
i从 1 到 4,if条件不满足,正常打印1 2 3 4。i变为 5,if条件满足,执行continue。- 程序跳过
printf("%d ", i);,直接执行i++(for循环的增量部分)。 - 然后判断
i <= 10(i是 6),条件为真,继续循环。 - 后续
i从 6 到 10,正常打印6 7 8 9 10。
输出结果:
1 2 3 4 6 7 8 9 10
b) 在 while 和 do-while 循环中
在 while 和 do-while 循环中,执行 continue 后,程序会:
- 立即跳转到循环条件进行判断。
- 如果条件为真,则开始下一次循环。
示例:使用 while 循环,跳过负数
#include <stdio.h>
int main() {
int i = 0;
while (i < 10) {
i++; // 必须在 continue 之前递增,否则会陷入死循环
if (i % 2 == 0) {
// 跳过偶数
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
执行过程:
i从 0 开始。i++后i变为 1。if (1 % 2 == 0)为假,打印1。i++后i变为 2。if (2 % 2 == 0)为真,执行continue。- 程序直接跳转到
while (i < 10)进行判断。i仍然是 2。 i++后i变为 3。if (3 % 2 == 0)为假,打印3。- ...以此类推。
输出结果:
1 3 5 7 9
⚠️ 重要警告:在
while或do-while循环中使用continue时要格外小心!
continue之前的代码没有改变循环变量的值,continue跳过了改变循环变量的代码,那么循环条件将永远不变,导致无限循环。错误示例:
int i = 0; while (i < 10) { if (i == 5) { continue; // 死循环!i 永远是 5,永远不会执行到 i++ } i++; printf("%d ", i); }
continue 与 break 的区别
初学者经常混淆 continue 和 break,它们有本质的不同:
| 特性 | continue |
break |
|---|---|---|
| 作用 | 跳过本次循环的剩余部分,进入下一次循环。 | 完全终止并跳出整个循环。 |
| 影响范围 | 只影响当前循环。 | 终止最近的 for、while、do-while 或 switch 语句。 |
| 循环次数 | 循环的总次数不变,只是跳过了某几次的执行。 | 提前结束循环,循环的总次数会减少。 |
示例对比:
#include <stdio.h>
int main() {
printf("--- 使用 continue ---\n");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
printf("continue: i = %d\n", i);
}
printf("\n--- 使用 break ---\n");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break;
}
printf("break: i = %d\n", i);
}
return 0;
}
输出结果:
--- 使用 continue ---
continue: i = 1
continue: i = 2
continue: i = 4
continue: i = 5
--- 使用 break ---
break: i = 1
break: i = 2
可以看到,continue 跳过了 i=3 的打印,但循环继续,而 break 在 i=3 时直接终止了整个循环,i=4 和 i=5 的代码再也没有机会执行。
嵌套循环中的 continue
当 continue 出现在嵌套循环中时,它只影响包含它的最近的一层循环。
示例:
#include <stdio.h>
int main() {
for (int i = 1; i <= 3; i++) {
printf("--- 外层循环 i = %d ---\n", i);
for (int j = 1; j <= 3; j++) {
if (j == 2) {
continue; // 这个 continue 只影响内层 for 循环
}
printf(" 内层循环 j = %d\n", j);
}
}
return 0;
}
输出结果:
--- 外层循环 i = 1 ---
内层循环 j = 1
内层循环 j = 3
--- 外层循环 i = 2 ---
内层循环 j = 1
内层循环 j = 3
--- 外层循环 i = 3 ---
内层循环 j = 1
内层循环 j = 3
当 j == 2 时,continue 跳过了内层循环的 printf 语句,然后继续执行内层循环的下一次迭代,外层循环不受任何影响。
continue 的最佳实践与注意事项
-
提高可读性:
continue可以用来处理“异常”或“特殊情况”,从而减少代码的嵌套层级,使“正常逻辑”更清晰。- 不推荐(深层嵌套):
for (...) { if (condition1) { // ... 很多代码 } else { // ... 正常逻辑 } } - 推荐(扁平化逻辑):
for (...) { if (condition1) { continue; // 快速跳过异常情况 } // ... 这里只写正常逻辑,代码更清晰 }
- 不推荐(深层嵌套):
-
避免过度使用:
continue用得太多,会导致逻辑变得分散,难以追踪,如果循环体很短,或者逻辑很简单,直接使用if-else可能更直观。 -
注意
while和do-while循环:如前所述,在这两种循环中使用continue前,确保循环变量已经被正确更新,否则极易造成死循环。 -
与
goto比较:continue是一种结构化的跳转,比goto更安全、更易于理解,你可以用continue来模拟goto的某些用法,但通常continue是更好的选择。
continue 是 C 语言中一个非常有用的控制流工具,它允许你灵活地控制循环的执行流程。
- 核心功能:跳过本次循环剩余代码,进入下一次迭代。
- 适用场景:当遇到特定条件时,你不想执行循环体中的剩余代码,但又希望循环继续下去。
- 关键区别:它不同于
break,break是彻底终止循环。 - 使用要点:在
while/do-while中要小心防止死循环;在嵌套循环中,它只作用于最近的循环。
掌握 continue 可以帮助你写出更简洁、更高效的循环代码。
