【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 <stdio.h>
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
文の使い方を練習してください。
- ユーザーに数値を入力させ、0以下の値が入力された場合にエラーメッセージを表示して終了するプログラムを作成してください。
- 2つの数値を入力させ、どちらかが負の場合にエラーメッセージを表示して終了するプログラムを作成してください。
- 配列の要素を順に表示し、負の値が見つかった場合にエラー処理にジャンプするプログラムを作成してください。
7. 練習問題の解答と解説
問1の解答
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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
文は、特定の条件で処理をジャンプさせる便利なツ