C++ 中的 continue 语句
Jinku Hu
2023年10月12日
本文将解释如何在 C++ 中使用 continue
语句。
使用 continue
语句跳过循环体的剩余部分
continue
语句与迭代语句结合使用来操纵依赖于循环的块执行。即,一旦在循环中到达 continue
语句,则跳过以下语句,并且控制移动到条件评估步骤。如果条件为真,则循环照常从新的迭代周期开始。
请注意,continue
只能包含在至少由以下循环语句之一包围的代码块中:for
、while
、do...while
或基于范围的 for
。假设我们有多个嵌套循环,并且 continue
语句包含在内部循环中。跳过行为仅影响内部循环,而外部循环的行为与往常一样。
在下面的示例中,我们演示了两个 for
循环,其中的内部循环遍历字符串的 vector
。请注意,在循环体的开头指定了 continue
语句,它主要控制是否执行以下语句。因此,带有 rtop
和 ntop
的字符串值不会显示在输出中,并且外循环执行其所有循环。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;
int main() {
vector<string> vec = {"ntop", "mtop", "htop", "ktop",
"rtop", "ltop", "ftop", "atop"};
for (int i = 0; i < 3; i++) {
for (const auto &it : vec) {
if (it == "rtop" || it == "ntop") continue;
cout << it << ", ";
}
cout << endl;
}
return EXIT_SUCCESS;
}
输出:
mtop, htop, ktop, ltop, ftop, atop,
mtop, htop, ktop, ltop, ftop, atop,
mtop, htop, ktop, ltop, ftop, atop,
或者,我们可以使用 goto
语句而不是 continue
来实现与前面代码片段相同的行为。请记住,goto
作为无条件跳转到程序中的给定行,不应用于跳过变量初始化语句。在这种情况下,空语句可以用 END
标签标记,以便 goto
将执行移动到给定点。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;
int main() {
vector<string> vec = {"ntop", "mtop", "htop", "ktop",
"rtop", "ltop", "ftop", "atop"};
for (int i = 0; i < 3; i++) {
for (const auto &it : vec) {
if (it == "rtop" || it == "ntop") goto END;
cout << it << ", ";
END:;
}
cout << endl;
}
return EXIT_SUCCESS;
}
continue
语句可以被一些编码指南视为不好的做法,使代码更难阅读。同样的建议经常被给予过度使用 goto
语句。尽管如此,当给定的问题可以内化可读性成本并使用这些语句提供更容易的实现时,可以使用这些结构。下一个代码示例显示了 while
循环中 continue
语句的基本用法。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;
int main() {
vector<string> vec = {"ntop", "mtop", "htop", "ktop",
"rtop", "ltop", "ftop", "atop"};
while (!vec.empty()) {
if (vec.back() == "atop") {
vec.pop_back();
continue;
}
cout << vec.back() << ", ";
vec.pop_back();
}
cout << "\nsize = " << vec.size() << endl;
return EXIT_SUCCESS;
}
输出:
ftop, ltop, rtop, ktop, htop, mtop, ntop,
size = 0
作者: Jinku Hu