C++ 中的 continue 语句

Jinku Hu 2021年10月2日
C++ 中的 continue 语句

本文将解释如何在 C++ 中使用 continue 语句。

使用 continue 语句跳过循环体的剩余部分

continue 语句与迭代语句结合使用来操纵依赖于循环的块执行。即,一旦在循环中到达 continue 语句,则跳过以下语句,并且控制移动到条件评估步骤。如果条件为真,则循环照常从新的迭代周期开始。

请注意,continue 只能包含在至少由以下循环语句之一包围的代码块中:forwhiledo...while 或基于范围的 for。假设我们有多个嵌套循环,并且 continue 语句包含在内部循环中。跳过行为仅影响内部循环,而外部循环的行为与往常一样。

在下面的示例中,我们演示了两个 for 循环,其中的内部循环遍历字符串的 vector。请注意,在循环体的开头指定了 continue 语句,它主要控制是否执行以下语句。因此,带有 rtopntop 的字符串值不会显示在输出中,并且外循环执行其所有循环。

#include <iostream>
#include <iomanip>
#include <vector>

using std::cout; using std::endl;
using std::setw; using std::vector;
using std::string;

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 <iostream>
#include <iomanip>
#include <vector>

using std::cout; using std::endl;
using std::setw; using std::vector;
using std::string;

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 <iostream>
#include <iomanip>
#include <vector>

using std::cout; using std::endl;
using std::setw; using std::vector;
using std::string;

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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ Loop