## gotoとは
gotoとは、今処理している場所から他の場所を処理するように、処理をジャンプするものです。
gotoは以下の場合などに使います。
– switchで指定したcaseに処理を移動する時
– 深い階層から抜け出す時
## gotoの使い方や書き方
goto ラベル名;
ラベル名:;
gotoキーワードのあとに、処理を移動したいラベル名を書きます。
これにより、goto ラベル名;が実行された時に、指定したラベル名へ処理が移動します。
処理を移動したい場所に、好きなラベル名を書き、そのあとに「 : 」(コロン)を書きます。
これにより、goto ラベル名;が実行された時に、ラベル名:;へ処理が移動します。
using static System.Console;
class TestClass
{
static void Main()
{
int a = 0;
for (a = 0; a < 10; a++)
{
if (a == 5)
{
goto idou;
}
}
idou:
WriteLine("イチゴが" + a + "個");
}
}
イチゴが5個
1. if (a == 5)で、aが5になった時点でgoto idou;が実行されます。
2. goto idou;が実行されると、idou:へ処理が移動します。
3. idou:へ処理が移動したため、そのあとのWriteLine(“イチゴが” + a + “個”);が実行されます。
4. aが5になった時点でforを抜け出したので、WriteLine(“イチゴが” + a + “個”);の実行結果がイチゴが5個になります。
## gotoとラベルは同じメソッド内に書かないとエラーになる
using static System.Console;
class TestClass
{
static void Main()
{
string kago1 = "イチゴ";
string kago2 = "モモ";
if (kago1 == "イチゴ")
{
WriteLine("イチゴです。");
goto idou;
}
if (kago2 == "ミカン")
{
idou:
WriteLine("ミカンです。");
}
}
}
// gotoの範囲内に「idou」というラベルはありません
Error CS0159: No such label 'idou' within the scope of the goto statement
// このラベルは参照されていません
Warning CS0164: This label has not been referenced
1. goto idou;とidou:は別々のif文の中に指定しているため、gotoの範囲内に「idou」というラベルはありませんというエラーとこのラベルは参照されていませんという警告が表示されます。
## gotoをswitchで使う
gotoのラベルは、switchのcaseやdefaultに指定することができます。
switch (式)
{
case 定数1:
// 処理
goto default;
case 定数2:
// 処理
goto case 定数名;
default:
// 処理
break;
}
指定した「 case 定数名 」へ実行する処理が移動し、「 case 定数名 」の処理が実行されます。
default:へ実行する処理が移動し、「 default 」の処理が実行されます。
### switchのcaseに移動
using static System.Console;
class TestClass
{
static void Main()
{
string kago = "イチゴ";
switch (kago)
{
case "果物":
WriteLine("果物です。");
break;
case "イチゴ":
WriteLine("イチゴです。");
goto case "果物";
}
}
}
イチゴです。
果物です。
2. case “果物”:内の処理のWriteLine(“果物です。”);
break;が実行されます。
### switchのdefaultに移動
using static System.Console;
class TestClass
{
static void Main()
{
string kago = "イチゴ";
switch (kago)
{
case "イチゴ":
WriteLine("イチゴです。");
goto default;
default:
WriteLine("果物です。");
break;
}
}
}
イチゴです。
果物です。
2. default:内の処理のWriteLine(“果物です。”);
break;が実行されます。
## gotoでforの深い階層から抜け出す
以下の例では、ネストしたforからgotoを使って抜け出しています。
using static System.Console;
class TestClass
{
static void Main()
{
int a = 0, b = 0;
for (a = 0; a < 10; a++)
{
for (b = 0; b < 10; b++)
{
if (b == 5)
{
goto erabu;
}
}
}
erabu:
WriteLine("イチゴが" + a + b + "個");
}
}
イチゴが05個
1. if (b == 5)でbの値が5になるとif文のブロック内のgoto erabu;が実行されます。
2. goto erabu;が実行されると、実行する処理がerabu:へ移動し、ネストされたforから抜け出します。
3. erabu:のあとから処理が再開します。
4. WriteLine(“イチゴが” + a + b + “個”);が実行され、「 イチゴが05個 」と表示されます。