この章のテーマ §
goto文について学びます。goto文の乱用は禁物ですが、これがないと上手く書けないケースがあります。
前提知識 §
Console.WriteLineメソッド, 変数の基礎, 条件演算子, int型, for文
解説 §
goto文は、プログラムの実行位置を指定したラベルの場所まで飛ばします。
たとえば、break文は1つのループからの強制脱出を可能としますが、ネストしたループからは出られません。しかし、goto文なら出られます。
書式は"goto ラベル名;"です。ラベルは、"ラベル名:"です。
罠の数々 §
- goto文は無い方が良いのか、あった方が良いのかのgoto論争が存在するが、C言語風の構文を持った多くのプログラミング言語にgoto文は存在する。C#にもある
- 存在しても使わない人、利用を禁止する人も多い
- C#のgotoは、C言語のgotoよりもずっと制約が厳しく危険性はずっと少ないが、しばしば"goto=悪"と思い込んだ正義の戦士から攻撃される
- gotoで他のメソッドには移動できない。また、ループから出ることはできるが、ループに入ることはできない
- 一般的に、goto抜きで簡単に書ける処理はgoto抜きで書いた方が良い。しかし、希にgoto抜きではエレガントに書けないケースがある。たまに見かけて慌てないために知っておくと良い
参考リンク §
goto ステートメント
サンプルソース: kw_goto §
for (int x = 0; x < 10; x++)
{
for (int y = 0; y < 10; y++)
{
Console.Write($"x={x},y={y} ");
if (x * y > 20) goto exitLabel;
}
}
// 以下の1行は永遠に実行されない
Console.WriteLine("Loop End");
// 以下の1行はexitLabelという名前のラベル
exitLabel:
Console.WriteLine("Done");
実行結果 §
x=0,y=0 x=0,y=1 x=0,y=2 x=0,y=3 x=0,y=4 x=0,y=5 x=0,y=6 x=0,y=7 x=0,y=8 x=0,y=9 x=1,y=0 x=1,y=1 x=1,y=2 x=1,y=3 x=1,y=4 x=1,y=5 x=1,y=6 x=1,y=7 x=1,y=8 x=1,y=9 x=2,y=0 x=2,y=1 x=2,y=2 x=2,y=3 x=2,y=4 x=2,y=5 x=2,y=6 x=2,y=7 x=2,y=8 x=2,y=9 x=3,y=0 x=3,y=1 x=3,y=2 x=3,y=3 x=3,y=4 x=3,y=5 x=3,y=6 x=3,y=7 Done
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
goto label;
int a = 1;
label:
Console.WriteLine(a);
- 0
- 1
- コンパイルエラー
- 実行時例外
[[解答]]