goto文 概要
C言語には、処理の流れを強制的に移動させる goto文 があります。
しかし現在では、
👉 基本的に使うべきではない構文
とされています。
なぜそう言われるのかを、しっかり理解しておきましょう。
初心者さんgotoって使っていいの?



なんか危険って聞いたことあります…



うん、基本は使わない。理由をちゃんと理解しておこう
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


goto文とは
goto文とは、指定したラベルへ処理をジャンプさせる構文です。
基本構文
goto ラベル名;
/* 途中の処理 */
ラベル名:
処理;基本例
#include <stdio.h>
int main()
{
int i = 0;
start:
printf("%d\n", i);
i++;
if (i < 3)
goto start;
return 0;
}実行結果
0
1
2💡 実はループと同じことができる
このコードは、以下と同じ動きです。
for (int i = 0; i < 3; i++) {
printf("%d\n", i);
}👉 つまり、gotoはループの代わりにもなる構文です
C言語のループ処理にはfor、while、do-whileがあり、詳細はこちらの記事で解説しています。






gotoが嫌われる本当の理由
① 処理の流れが分かりづらくなる
通常のコードは「上から下へ」読み進めますが、
gotoはその流れを壊します。
goto A;
/* 中略 */
A:👉 どこから来たのか分からないコードになる
② スパゲッティコードになる
goto A;
A:
goto B;
B:
goto A;👉 処理の流れが絡み合い、人間が理解できなくなる
③ バグの原因になりやすい
- どの経路で来たのか分からない
- 状態が追えない
- 条件ミスに気づきにくい
👉 デバッグが非常に困難になる
④ 構造化プログラミングに反する
現在のプログラムは
- for文
- while文
- if文
- switch文
などの「構造化された制御」で書くのが基本です。
👉 gotoはこれを無視する構文
🧠 なぜ昔は使われていたのか
- アセンブリ言語に近い制御が必要だった
- 制御構文が未発達だった
👉 低レベル制御の名残
🎯 現代での立ち位置
👉 ほぼ使われない(禁止に近い扱い)
- 可読性が重視されるため
- チーム開発では特にNG
⚡ 例外:それでも使われる場面
完全にゼロではありません。
エラーハンドリング(限定用途)
FILE *fp = fopen("file.txt", "r");
if (!fp)
goto cleanup;
char *buf = malloc(100);
if (!buf)
goto cleanup;
printf("成功\n");
free(buf);
fclose(fp);
return 0;
cleanup:
printf("エラー発生\n");
if (buf) free(buf);
if (fp) fclose(fp);
return -1;💡 なぜこの場合だけ使うのか
👉 後処理をまとめるため
- リソース解放
- エラー時の共通処理
👉 ネストを深くせずに書ける
ただし、
👉 これは「便利だから使う」のではない
👉 仕方なく使う例外パターン



じゃあ積極的に使うものではないですね?



そうだね、基本は避ける前提だね
まとめ
- gotoは処理を任意の位置にジャンプさせる構文
- 可読性・保守性が大きく下がるため基本NG
- 現代ではほぼ使われない
- エラーハンドリングで例外的に使われることがある
この記事が参考になった方へ
制御構文を含むC言語の基本文法をこちらの記事で整理しています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント