C言語入門|制御構文の総仕上げ:無限ループと goto 文

ここまで、本当によく頑張りました 😊
順次・分岐・繰り返しと、制御構文を一通り学び終え、
プログラムの流れを自分の手でコントロールできるようになってきましたね。

この最後のテーマでは、
制御構文の“限界”と“奥の手” を知ります。

  • 永久に繰り返す 無限ループ
  • 強制的に処理を飛ばす goto 文

どちらも扱いを間違えると危険ですが、
仕組みとリスクを理解したうえで知っておくこと がとても大切です。

無限ループとは何か

強制的に停止しない限り、
永遠に処理を繰り返し続ける構造 を無限ループと呼びます。

初心者のうちは、

  • 条件式を書き間違えた。
  • ループ変数を更新し忘れた。

といった理由で、
意図せず無限ループに陥ることがよくあります。

ですが実は、
あえて無限ループを作りたい場面 も存在します。

無限ループの代表的な書き方

無限ループを作る代表的な方法は、次の2つです。

while を使う方法

プロジェクト名:5-10-1 ソースファイル名: sample5-10-1.c

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    while (true) {
        printf("待機中です...\n");
    }
    return 0;
}

条件式が常に真なので、
ループは一生終わりません。

なお、true の代わりに 1 を使っても同じ意味になります。

for を使う方法

プロジェクト名:5-10-2 ソースファイル名: sample5-10-2.c

#include <stdio.h>

int main(void)
{
    for (;;) {
        printf("監視処理を実行中\n");
    }
    return 0;
}

for 文の
初期化・条件・更新をすべて省略すると、
条件判定が存在しないため永久ループになります。

無限ループは危険?それとも便利?

無限ループは一見怖そうですが、

  • ゲームのメインループ
  • サーバーの常駐処理
  • 入力待ち状態の管理

などでは、必須のテクニック です。

大切なのは、

  • break や return で抜け道を用意する
  • 強制終了できることを理解して使う

という意識を持つことです 😊

goto 文という“第4の制御構造”

これまで学んできた制御構造は、

  • 順次
  • 分岐(if, switch)
  • 繰り返し(while, do-while, for)

の3つでした。

実は C 言語には、
もう1つだけ特別な制御方法 が存在します。

それが goto 文です。

goto 文の基本的な動き

goto 文は、
指定した場所に処理を強制ジャンプさせる命令 です。

プロジェクト名:5-10-3 ソースファイル名: sample5-10-3.c

#include <stdio.h>

int main(void)
{
    printf("処理を開始します\n");
    printf("ステップ1\n");

    goto FINISH;

    printf("ステップ2\n");
    printf("ステップ3\n");

FINISH:
    printf("処理を終了します\n");
    return 0;
}

実行結果

処理を開始します
ステップ1
処理を終了します

goto 文によって、
途中の処理をすべて飛ばして
ラベルの位置へジャンプしています。

ラベルと goto 文の書式

ラベル

ラベル名:
  • ソースコード中の目印
  • 名前は自由に付けられる。

goto 文

goto ラベル名;
  • 指定したラベルへ処理を移動
  • 同じ関数内でのみ使用可能

goto 文の危険性

goto 文はとても強力です。
ですが、その分リスクも大きい命令です。

乱用すると、

  • 処理の流れが追えなくなる。
  • バグの原因が特定できない。
  • 修正が困難なコードになる。

といった問題が起こります。

このような、
制御が絡み合って理解不能になったコードは
スパゲティプログラム と呼ばれます 🍝

goto 文は「諸刃の剣」

goto 文は、

  • 便利だが危険
  • 強力だが扱いが難しい。

まさに 諸刃の剣 です。

そのため、開発現場では

  • goto 使用禁止
  • goto は原則使わない

といったルールが設けられていることも珍しくありません。

それでも goto を使うべき例外的な場面

原則として goto 文はおすすめしません。
それでも、次の2つのケースでは
慎重に使う価値がある とされています。

➀ 深くネストしたループを一気に抜けたいとき

何重にも重なったループを
一発で脱出したい場合、
無理に break を重ねるより
goto のほうが読みやすくなることがあります。

➁ エラー時の後片付け処理

  • ファイルを開いた。
  • メモリを確保した。
  • 通信を開始した。

といった処理の途中でエラーが起きた場合、
後片付けを1か所にまとめるために
goto を使うケースがあります。

制御構文の学習を終えて 😊

これで、あなたは

  • 順次
  • 分岐
  • 繰り返し
  • 無限ループ
  • ジャンプ

C言語の制御構文をすべて理解しました。

コンピュータに
「どんな順番で、どんな条件で、どこまで処理させるか」
を正確に指示できる力が、もう身についています ✨