goto文とは?C言語で非推奨と言われる理由と使うべきでない理由を解説

目次

goto文 概要

C言語には、処理の流れを強制的に移動させる goto文 があります。

しかし現在では、

👉 基本的に使うべきではない構文

とされています。

なぜそう言われるのかを、しっかり理解しておきましょう。

初心者さん

gotoって使っていいの?

初心者さん

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

エンジニアくん

うん、基本は使わない。理由をちゃんと理解しておこう

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。

C言語文法解説シリーズ一覧はこちら

goto文とは

goto文とは、指定したラベルへ処理をジャンプさせる構文です。


基本構文

C
goto ラベル名;

/* 途中の処理 */

ラベル名:
    処理;

基本例

C
#include <stdio.h>

int main()
{
    int i = 0;

start:
    printf("%d\n", i);
    i++;

    if (i < 3)
        goto start;

    return 0;
}

実行結果

C
0
1
2

💡 実はループと同じことができる

このコードは、以下と同じ動きです。

C
for (int i = 0; i < 3; i++) {
    printf("%d\n", i);
}

👉 つまり、gotoはループの代わりにもなる構文です


C言語のループ処理にはfor、while、do-whileがあり、詳細はこちらの記事で解説しています。

gotoが嫌われる本当の理由

① 処理の流れが分かりづらくなる

通常のコードは「上から下へ」読み進めますが、
gotoはその流れを壊します。

C
goto A;

/* 中略 */

A:

👉 どこから来たのか分からないコードになる


② スパゲッティコードになる

C
goto A;

A:
goto B;

B:
goto A;

👉 処理の流れが絡み合い、人間が理解できなくなる


③ バグの原因になりやすい

  • どの経路で来たのか分からない
  • 状態が追えない
  • 条件ミスに気づきにくい

👉 デバッグが非常に困難になる


④ 構造化プログラミングに反する

現在のプログラムは

  • for文
  • while文
  • if文
  • switch文

などの「構造化された制御」で書くのが基本です。

👉 gotoはこれを無視する構文


🧠 なぜ昔は使われていたのか

  • アセンブリ言語に近い制御が必要だった
  • 制御構文が未発達だった

👉 低レベル制御の名残


🎯 現代での立ち位置

👉 ほぼ使われない(禁止に近い扱い)

  • 可読性が重視されるため
  • チーム開発では特にNG

⚡ 例外:それでも使われる場面

完全にゼロではありません。


エラーハンドリング(限定用途)

C
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言語の基本文法をこちらの記事で整理しています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X(旧Twitter)でも発信しています
👉 Xはこちら

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ

コメント

コメントする


目次