C 言語で goto ステートメントを使用する

胡金庫 2023年10月12日
  1. goto 文を使って C 言語でループを実装する
  2. goto 文を使って C 言語のネストされたループから抜け出す
C 言語で goto ステートメントを使用する

この記事では、C 言語での goto 文の使い方について複数の方法を紹介します。

goto 文を使って C 言語でループを実装する

goto キーワードは C 言語の一部であり、無条件にジャンプするための構文を提供します。ifswitch 文は条件付きジャンプの例です。goto 構造体は、goto 呼び出しとラベル名の 2つの部分から構成されています。コード中の任意の文の前にはラベルを付けることができます。goto 呼び出しは、ラベルの後の最初の文にジャンプするようにコードを強制的に実行します。goto は同じ関数内でのみラベルにジャンプすることができ、ラベルはどの行で定義されているかに関係なく関数全体で表示されます。

次の例では、各サイクルで変数 score1000 を比較する単純なループを示します。score が等しくない場合は、インクリメントして再び比較文にジャンプします。一旦 if 文が真になると、別の goto 呼び出しが呼び出され、実行は EXIT ラベルにジャンプしてプログラムを通常の終了に導きます。この例題コードは、他の多くのコードと同様に、goto 文を使わずに再実装することができ、比較的読みやすいものとなっています。一般的に、goto 文については活発な議論が行われており、ある者は可読性のあるコードにとって全く有害であると考え、またある者はまだ実用的な使用例があると考えています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

int main(int argc, char *argv[]) {
  int score = 1;

START:
  if (score > 1000) goto EXIT;

  score += 1;
  goto START;

EXIT:
  printf("score: %d\n", score);
  exit(EXIT_SUCCESS);
}

出力:

score: 1001

goto 文を使って C 言語のネストされたループから抜け出す

goto 文は、ループ内の条件文が満たされた場合に制御フローを変更するのに便利であり、いくつかのコードは同様にスキップする必要があります。以下のコードサンプルでは、環境変数の配列にアクセスして検索するという同様のシナリオを示しています。外部の if 文はポインタが有効かどうかをチェックし、その後にループを実行していることに注目してください。ループ自体はその内部に別の条件を持っており、それぞれの環境変数の特定の文字列をチェックします。文字列が見つかった場合、ループを抜け出して、これ以上処理リソースを無駄にせず、次の printf 文をスキップすることができます。これにより、goto 呼び出しを内側の if 文の中に含めることで、プログラムを外側の if 文の外側にジャンプさせ、残りのコードを実行し続けることができるという便利なケースが生まれます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

int main(int argc, char *argv[]) {
  if (environ != NULL) {
    for (size_t i = 0; environ[i] != NULL; ++i) {
      if (strncmp(environ[i], "HOME", 4) == 0) {
        puts(environ[i]);
        goto END;
      }
    }
    printf("No such variable found!\n");
  }
END:

  exit(EXIT_SUCCESS);
}

出力:

HOME=/home/username
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook