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