在C语言循环结构里,continue是一个容易被误读的关键字。它的作用是立即结束本次循环体中尚未执行的语句,跳转到循环底部的条件判断或迭代部分,从而开启下一轮循环。很多初学者把它和break混淆,其实二者行为完全不同:break会直接终止整个循环,而continue只是略过当前轮次。

continue的基本语法与执行流程
C语言里的continue本身是一个无参数语句,单独写成continue;即可。当程序执行流遇到它时,会放弃本次循环中位于其后的所有代码,根据循环类型进入不同处理阶段。在for循环中,遇到continue后,控制会转移到更新表达式(如i++),然后再做条件测试;在while和do-while中,则直接跳回条件判断处。
理解这个差异非常关键。下面是一段for循环中使用continue的示例,它会打印出0到9之间的偶数,奇数被跳过:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 10; i++) {
if (i % 2 != 0) {
continue; // 奇数时跳过本次循环剩余部分
}
printf("偶数: %dn", i);
}
return 0;
}
上述代码运行时,当i为1、3、5等奇数,continue触发,printf不会执行,但i++依然在每次循环末正常进行,因此不会造成死循环。这展示了continue在for中的安全性:迭代语句总会被执行。
while循环中使用continue的陷阱
在while循环里使用continue要格外小心,因为while的循环变量更新通常写在循环体内部。如果continue出现在更新语句之前,就会导致变量永远不被修改,形成死循环。这种错误在实际项目中十分常见,尤其是处理用户输入或文件读取时。
看下面这段有问题的代码,它本意是跳过小于零的值,但却忘了在continue前增加计数器:
#include <stdio.h>
int main() {
int i = 0;
while (i < 5) {
if (i < 0) {
continue; // 危险:跳过了下面的 i++
}
printf("i = %dn", i);
i++;
}
return 0;
}
虽然本例中i初始为0不会进if,但如果i被意外改为负数就会死循环。正确写法应保证continue前或while条件中能推进状态,例如把i++放到continue之前,或改用for循环。相比之下,for循环把迭代逻辑集中到头部,能自然规避此类问题。
continue与break的对比及适用场景
从语义上看,break用于彻底退出循环,常配合找到目标、发生错误等情形;continue则用于剔除不需要处理的本次数据,让循环继续。二者可组合使用,比如在遍历数组时,用continue跳过非法项,用break在达到上限时停止。
考虑一个统计正数和的场景,同时忽略零和负数,并在总和超过100时结束:
#include <stdio.h>
int main() {
int arr[] = {5, -3, 20, 0, 50, 40, -10, 60};
int size = 8;
int sum = 0;
for (int i = 0; i < size; i++) {
if (arr[i] <= 0) {
continue; // 跳过非正数
}
sum += arr[i];
if (sum > 100) {
break; // 超过阈值终止
}
}
printf("总和: %dn", sum);
return 0;
}
这个例子清楚划分了二者的职责:continue过滤数据,break控制总体边界。在复杂业务逻辑中,合理使用它们可以减少层层if-else嵌套,使主流程更平坦。但也要注意不能滥用continue,若跳过条件过多,不如在循环开头用if包裹主体,可读性可能更好。
嵌套循环中的continue行为
需要明确的是,continue只影响它所在的那一层循环,不会中断外层循环。在多层for嵌套处理矩阵或组合时,若想跳过外层当前轮,仅靠内层的continue是不够的,往往需要借助标志变量或重构为函数配合return。
例如打印九九乘法表但跳过结果为偶数的式子,内层continue仅跳过内层本次:
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
int prod = i * j;
if (prod % 2 == 0) {
continue; // 仅跳过内层本次
}
printf("%d*%d=%d ", i, j, prod);
}
printf("n");
}
return 0;
}
上述代码中,外层i的遍历完全不受内层continue干扰。如果业务要求当某一行出现特定条件就跳过整行,则要在外层判断或使用goto(谨慎使用)跳出内层。总体而言,理解continue的作用域边界,是编写正确多维循环的前提。