C++ で goto ステートメントを利用する

胡金庫 2023年10月12日
  1. C++ で goto 文を使ってプログラム制御フローのジャンプを実現する
  2. C++ で goto ステートメントを使用してループスタイルの反復を実装する
C++ で goto ステートメントを利用する

この記事では、C++ で goto ステートメントを利用する方法を紹介します。

C++ で goto 文を使ってプログラム制御フローのジャンプを実現する

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 条件は各反復を評価し、コントロールがループを終了するかどうかを決定します。ループ本体に START および END という名前のラベルを付けていることに注意してください。基本的に、反復は 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Statement