一、概述
除了选择语句和循环语句外,C++ 还提供了几种可以改变程序正常执行流程的控制语句:break、continue 和 goto。合理使用这些语句可以更灵活地控制程序的执行路径。
二、break 语句
作用
break 语句用于中断当前所在的循环(while、do…while、for)或 switch 语句,程序跳转到该循环或 switch 之后的下一条语句继续执行。
语法
break;Code language: JavaScript (javascript)
执行效果
当 break 被执行时,整个循环立即终止,不再进行条件判断,也不再执行循环体中 break 之后的语句。
示例
for (int i = 0; i < 100; i++)
{
if (i % 6 == 0 && i % 9 != 0)
{
cout << i << " ";
// break; // 如果取消注释,找到第一个满足条件的数后循环立即终止
}
}Code language: JavaScript (javascript)
分析:如果不加 break,程序会输出所有满足条件的数。如果取消 break 注释,则找到第一个满足条件的数(i = 6)后循环立即结束,只输出 6。
三、continue 语句
作用
continue 语句用于中断本次循环的剩余操作,直接进入下一次循环的条件判断。在 while 和 do…while 中,跳转到条件判断;在 for 中,跳转到表达式 2(更新语句)然后判断表达式 1。
语法
continue;Code language: JavaScript (javascript)
执行效果
当 continue 被执行时,循环体中 continue 之后的语句被跳过,但循环本身并未终止,而是进入下一轮迭代。
示例
for (int i = 0; i < 100; i++)
{
if (i % 6 == 0 && i % 9 != 0)
{
if (i == 48)
{
continue; // 如果 i 是 48,跳过本次循环剩余部分
}
cout << i << " ";
}
}Code language: JavaScript (javascript)
分析:当 i = 48 时,continue 被执行,cout 语句被跳过,因此 48 不会被输出。其余满足条件的数正常输出。
四、goto 语句
作用
goto 语句为无条件跳转语句,使程序跳转到指定标号的语句处继续执行。
语法
goto 标号名;
...
标号名:
语句Code language: PHP (php)
执行效果
程序执行到 goto 时,立即跳转到标号所在的位置继续执行。标号的作用域为当前函数内。
示例
cout << "1\n";
cout << "2\n";
difang:
cout << "3\n";
goto difang;
cout << "4\n";
cout << "5\n";
cout << "6\n";
cout << "7\n";
cout << "8\n";Code language: PHP (php)
分析:程序先输出 1 和 2,然后执行到标号 difang: 处输出 3,接着 goto difang; 跳回标号处,再次输出 3,如此反复形成无限循环。标号后面的 4、5、6、7、8 永远不会被执行。
五、代码示例
以下代码演示了三种控制语句的综合用法:
#include <iostream>
using namespace std;
int main()
{
// 示例1:break 在 for 循环中
cout << "break 示例(找第一个能被7整除的数):" << endl;
for (int i = 1; i <= 100; i++)
{
if (i % 7 == 0)
{
cout << "找到:" << i << endl;
break; // 找到后立即终止循环
}
}
// 示例2:break 在 while 循环中(输入验证)
cout << "\nbreak 示例(输入0退出):" << endl;
int input;
while (true)
{
cin >> input;
if (input == 0)
break; // 输入0时终止循环
cout << "你输入了:" << input << endl;
}
// 示例3:continue 跳过特定值
cout << "\ncontinue 示例(输出1~20中跳过5的倍数):" << endl;
for (int i = 1; i <= 20; i++)
{
if (i % 5 == 0)
continue; // 跳过5的倍数
cout << i << " ";
}
cout << endl;
// 示例4:continue 在 while 中
cout << "\ncontinue 示例(只输出正数):" << endl;
int arr[] = { 3, -1, 5, 0, -7, 8 };
int idx = 0;
while (idx < 6)
{
if (arr[idx] <= 0)
{
idx++;
continue; // 跳过非正数
}
cout << arr[idx] << " ";
idx++;
}
cout << endl;
// 示例5:goto 示例(不推荐,仅演示)
cout << "\ngoto 示例:" << endl;
int count = 0;
loop:
cout << "count = " << count << endl;
count++;
if (count < 3)
goto loop; // 跳回标号处
cout << "goto 结束" << endl;
// 示例6:break 在嵌套循环中(只跳出内层循环)
cout << "\nbreak 在嵌套循环中:" << endl;
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 5; j++)
{
if (j == 3)
break; // 只跳出内层 for 循环
cout << "i=" << i << " j=" << j << " ";
}
cout << endl;
}
return 0;
}Code language: PHP (php)
六、注意事项
- break 只能跳出当前所在的最内层循环或 switch 语句。在嵌套循环中,break 只终止内层循环,外层循环不受影响。
- continue 只影响当前所在的最内层循环,不影响外层循环。
- break 和 continue 只能用在循环语句和 switch 语句中,不能在其他地方使用。
- goto 语句可以跳转到函数内的任意标号处,但会破坏程序的结构化流程,使代码难以阅读和维护。建议尽量避免使用 goto。
- goto 不能跳过变量的初始化语句跳入其作用域,否则可能导致未定义行为。
- 在嵌套循环中,如果需要从深层循环直接跳出多层,可以考虑将循环提取为函数并使用 return 替代 goto。
七、break、continue 与 goto 的对比
| 语句 | 作用范围 | 跳转目标 | 使用建议 |
|---|---|---|---|
| break | 最内层循环或 switch | 循环或 switch 后的第一条语句 | 合理使用,提高代码效率 |
| continue | 最内层循环 | 下一次循环的条件判断处 | 合理使用,简化条件逻辑 |
| goto | 当前函数内任意标号 | 标号所在位置 | 尽量避免,破坏结构化设计 |
八、小结
- break 用于立即终止当前循环或 switch,跳转到结构之后的语句。
- continue 用于跳过本次循环剩余部分,直接进入下一次循环判断。
- goto 为无条件跳转语句,跳转到函数内指定标号处,不推荐使用。
- break 和 continue 是结构化控制语句,在循环中合理使用可以提高代码清晰度和效率。
- goto 会破坏程序结构,应尽量避免,仅在特殊情况下(如深层嵌套中快速退出)谨慎使用。
Previous: 循环结构与选择结构相互嵌套
Next: 自定义数据类型-typedef