在 C++ 中使用 goto 語句

Jinku Hu 2023年10月12日
  1. 使用 goto 語句在 C++ 中實現程式控制流跳轉
  2. 在 C++ 中使用 goto 語句來實現迴圈式迭代
在 C++ 中使用 goto 語句

本文將介紹如何在 C++ 中使用 goto 語句。

使用 goto 語句在 C++ 中實現程式控制流跳轉

goto 語句強制程式控制流跳轉到標籤指向的行。通常,C++ 中的任何語句都可以使用特殊符號進行標記,該符號由一個識別符號和一個冒號組成。通常,這些標籤識別符號在函式範圍內隨處可用。因此,它們可以通過位於標籤之前的 goto 語句引用。前面的作用域規則與變數的作用域規則不同——它強制變數在被其他語句使用之前被宣告。

但請注意,goto 不能向前跳轉到作用域並跳過具有初始化程式、非平凡建構函式/解構函式或非標量型別的變數宣告語句。否則,預計會引發編譯器錯誤。在下面的例子中,我們搜尋給定字串在文字中的第一個出現,一旦找到,迴圈就會用 goto 語句中斷,在程式的末尾移動控制。因此,指示失敗訊息的 cout 語句將被跳過,並且僅在沒有字串與使用者傳遞的字串值匹配時才執行。

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

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

int main() {
  string text(
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
      " Nam mollis felis eget diam fermentum, sed consequat justo pulvinar. ");
  string search_query;

  cout << "Enter a string to search: ";
  cin >> search_query;

  std::istringstream iss(text);
  string word;
  while (iss >> word) {
    if (word == search_query) {
      cout << "'" << search_query << "' - found in text" << endl;
      goto END;
    }
  }
  cout << "Could not find such string!" << endl;
END:

  return EXIT_SUCCESS;
}

或者,我們可以使用使用者輸入驗證函式來實現前面的示例,該函式在故障安全行為方面為程式碼增加了更強的魯棒性。cin 成員函式用於實現輸入檢查功能並返回對讀取資料的引用。

#include <iostream>
#include <limits>
#include <sstream>
#include <string>
#include <vector>

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

template <typename T>
T &validateInput(T &val) {
  while (true) {
    cout << "Enter a string to search: ";
    if (cin >> val) {
      break;
    } else {
      if (cin.eof()) exit(EXIT_SUCCESS);
      cout << "Enter a string to search:\n";
      cin.clear();
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }
  return val;
}

int main() {
  string text(
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
      " Nam mollis felis eget diam fermentum, sed consequat justo pulvinar. ");
  string search_query;

  validateInput(search_query);

  std::istringstream iss(text);
  string word;
  while (iss >> word) {
    if (word == search_query) {
      cout << "'" << search_query << "' - found in text" << endl;
      goto END;
    }
  }
  cout << "Could not find such string!" << endl;
END:

  return EXIT_SUCCESS;
}

在 C++ 中使用 goto 語句來實現迴圈式迭代

goto 語句可用於實現類似迴圈的行為,其中 if 條件評估每次迭代並確定控制是否會退出迴圈。請注意,我們用名稱 STARTEND 標記了迴圈體。基本上,迭代會增加 score 變數,直到它大於 1000。因此,當值計算為 1001 時,迭代會中斷,此時,程式將移動到呼叫 cout 語句的行。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  int score = 1;

START:
  if (score > 1000) goto EXIT;

  score += 1;
  goto START;
EXIT:
  cout << "score: " << score << endl;

  return EXIT_SUCCESS;
}

輸出:

score: 1001
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Statement