break 与 continue
break 和 continue 是 C 语言中控制循环流程的两个关键字。break 立即终止最近的循环或 switch,跳转到循环或 switch 之后的语句;continue 跳过本次循环的剩余部分,直接进入下一次迭代。它们让循环控制更灵活,但过度使用会降低代码可读性。
break
break 用于立即退出最近的 switch 或循环(while、do-while、for):
/* 找到第一个负数 */
int arr[] = {3, 7, -2, 5, 8};
int found = -1;
for (int i = 0; i < 5; i++) {
if (arr[i] < 0) {
found = i;
break; /* 找到后立即退出循环 */
}
}
printf("First negative at index %d\n", found); /* 2 */
/* 读取直到满足条件 */
int sum = 0;
int value;
while (1) { /* 无限循环 */
printf("Enter value (0 to stop): ");
scanf("%d", &value);
if (value == 0)
break; /* 退出循环 */
sum += value;
}
printf("Sum = %d\n", sum);
break 只跳出最近的循环或 switch:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1)
break; /* 只跳出内层 for */
printf("(%d,%d) ", i, j);
}
printf("\n");
}
/* 输出:
(0,0) (0,1) (0,2)
(1,0)
(2,0) (2,1) (2,2)
*/
要跳出多层循环,可以使用标志变量或 goto:
/* 使用标志变量 */
int found = 0;
for (int i = 0; i < 3 && !found; i++) {
for (int j = 0; j < 3; j++) {
if (matrix[i][j] == target) {
found = 1;
break; /* 跳出内层 */
}
}
/* 外层循环检查 found */
}
continue
continue 跳过本次循环的剩余语句,直接进入下一次迭代:
/* 只处理正数 */
int arr[] = {3, -1, 7, -5, 2};
for (int i = 0; i < 5; i++) {
if (arr[i] < 0)
continue; /* 跳过负数 */
printf("Processing %d\n", arr[i]);
}
/* 输出:
Processing 3
Processing 7
Processing 2
*/
/* 跳过空行 */
char line[100];
while (fgets(line, sizeof(line), stdin) != NULL) {
if (line[0] == '\n' || line[0] == '#')
continue; /* 跳过空行和注释行 */
process_line(line);
}
continue 在 for 循环中,会先执行更新表达式,再判断条件:
for (int i = 0; i < 5; i++) {
if (i == 2)
continue; /* 跳过 i == 2 */
printf("%d ", i);
}
/* 输出:0 1 3 4 */
/* i == 2 时,continue 后执行 i++,然后判断 i < 5 */
在 while 和 do-while 中,continue 直接跳到条件判断:
int i = 0;
while (i < 5) {
if (i == 2) {
i++; /* 必须手动更新,否则无限循环 */
continue;
}
printf("%d ", i);
i++;
}
break 与 continue 的选择
| 需求 | 使用 |
|---|---|
| 找到结果,不需要继续 | break |
| 某些情况跳过,继续下一次 | continue |
| 提前退出函数 | return |
/* break:找到即退出 */
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
index = i;
break;
}
}
/* continue:跳过某些元素 */
for (int i = 0; i < n; i++) {
if (arr[i] < 0)
continue; /* 跳过负数 */
sum += arr[i];
}
/* return:函数内直接返回 */
int find(int arr[], int n, int target)
{
for (int i = 0; i < n; i++) {
if (arr[i] == target)
return i; /* 找到,立即返回 */
}
return -1; /* 未找到 */
}
常见错误
break 在 if 中:
if (x > 0) {
break; /* 错误:break 只能在循环或 switch 中 */
}
continue 在 switch 中:
switch (x) {
case 1:
continue; /* 错误:continue 只能在循环中 */
}
break 跳出多层:
for (...) {
for (...) {
break; /* 只跳出内层 */
}
/* 继续外层循环 */
}
continue 导致无限循环:
int i = 0;
while (i < 5) {
if (i == 2)
continue; /* 无限循环!i 永远是 2 */
i++;
}
/* 正确 */
while (i < 5) {
if (i == 2) {
i++; /* 别忘了更新 */
continue;
}
/* ... */
i++;
}
最佳实践
- 用
break提前退出循环(找到结果、出错等) - 用
continue跳过不符合条件的迭代 - 避免深层嵌套中的
break/continue,考虑重构为函数 - 在
while/do-while中使用continue时,确保循环变量会被更新 - 不要滥用
break/continue替代正常的循环条件 - 循环逻辑复杂时,考虑用
return从函数中提前退出