C言語

【C言語】第2章第12回:goto文の使用例と注意点

goto文は、プログラムの実行を特定のラベルにジャンプさせる制御構文です。この章では、基本的な使い方から実用例、そしてgoto文を使う際の注意点について解説します。

1. goto文とは?

goto文は、プログラムの実行を特定の位置にジャンプさせるために使用します。しかし、乱用するとコードが読みづらくなるため、慎重に使用する必要があります。

基本構文

goto ラベル名;

// ラベルの定義
ラベル名:
    // 実行する処理

例:

#include <stdio.h>

int main() {
    printf("Start of the program.\n");
    goto skip; // ラベルskipにジャンプ

    printf("This will be skipped.\n");

    skip:
        printf("This is after the label.\n");

    return 0;
}

解説:

  • goto skip;:プログラムの実行がラベルskipにジャンプします。
  • printf("This will be skipped.");:この行は実行されません。

2. goto文の基本的な使用例

以下は、goto文を使用してエラー処理を行うプログラムの例です。

#include <stdio.h>

int main() {
    int value;

    printf("Enter a positive number: ");
    scanf("%d", &value);

    if (value < 0) {
        goto error; // 負の数の場合エラーメッセージへジャンプ
    }

    printf("You entered: %d\n", value);
    return 0;

    error:
        printf("Error: Negative numbers are not allowed.\n");
        return 1;
}

解説:

  • goto error;:負の数が入力された場合、エラーメッセージを出力します。
  • error::エラー処理のラベルを定義。

3. goto文の利点と制限

利点

  • 複雑な条件のエラー処理やクリーンアップに便利。
  • コードを簡潔にできる場合がある。

制限

  • コードが読みづらくなる(スパゲッティコードの原因)。
  • 保守性が低下する。
  • 過度に使用するとプログラムの構造が複雑になる。

4. 実用例:エラー処理

以下のプログラムは、複数のエラー条件をgoto文で処理する例です。

#include &lt;stdio.h&gt;

int main() {
    int a = 10, b = 0, result;

    if (b == 0) {
        goto error; // 0で割る場合エラー
    }

    result = a / b;
    printf("Result: %d\n", result);
    return 0;

    error:
        printf("Error: Division by zero is not allowed.\n");
        return 1;
}

解説:

  • 条件b == 0が真の場合、goto error;でエラー処理にジャンプします。
  • エラーがない場合、正常に計算結果が出力されます。

5. goto文の注意点

goto文を使用する際は、以下の点に注意しましょう:

  • コードの可読性を損なわないように、必要最小限の使用にとどめる。
  • エラー処理やクリーンアップ処理以外では避ける。
  • ラベル名を明確にし、ジャンプの意図を示すコメントを付ける。

6. 練習問題

以下の課題に挑戦して、goto文の使い方を練習してください。

  1. ユーザーに数値を入力させ、0以下の値が入力された場合にエラーメッセージを表示して終了するプログラムを作成してください。
  2. 2つの数値を入力させ、どちらかが負の場合にエラーメッセージを表示して終了するプログラムを作成してください。
  3. 配列の要素を順に表示し、負の値が見つかった場合にエラー処理にジャンプするプログラムを作成してください。

7. 練習問題の解答と解説

問1の解答

#include &lt;stdio.h&gt;

int main() {
    int value;

    printf("Enter a number: ");
    scanf("%d", &value);

    if (value <= 0) {
        goto error; // 0以下の値でエラー処理
    }

    printf("You entered: %d\n", value);
    return 0;

    error:
        printf("Error: Value must be greater than 0.\n");
        return 1;
}

問2の解答

#include &lt;stdio.h&gt;

int main() {
    int a, b;

    printf("Enter two numbers: ");
    scanf("%d %d", &a, &b);

    if (a < 0 || b < 0) {
        goto error; // 負の値でエラー処理
    }

    printf("You entered: %d and %d\n", a, b);
    return 0;

    error:
        printf("Error: Negative values are not allowed.\n");
        return 1;
}

問3の解答

#include &lt;stdio.h&gt;

int main() {
    int numbers[] = {1, 2, -3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    for (int i = 0; i < size; i++) {
        if (numbers[i] < 0) {
            goto error; // 負の値でエラー処理
        }
        printf("%d\n", numbers[i]);
    }

    return 0;

    error:
        printf("Error: Negative value found.\n");
        return 1;
}

8. まとめ

goto文は、特定の条件で処理をジャンプさせる便利なツ