こんにちは!こんばんは!
ちゃとらです(・ω・)/
goto文…プログラミング経験者の方ならもしかしたら一度は耳にしたことがあるかもしれません。
処理としては便利そうだけど、どうして嫌われているのでしょうか?
goto文の機能と嫌われている理由について解説していきます!
goto文とは
説明
goto文とは、同じラベル名の場所へと移動できる処理です。
ループ処理から抜け出すことができ、逆にループ処理を行うこともできます。
しかし、goto文で別関数に移動したり関数外の所へ移動することはできません。
goto ラベル名;
……
ラベル名: ~
goto文が実行されると条件分岐中であれループ処理中であれ同じラベル名の場合へ移動する。
サンプルコード
まずは、goto文を使ってループから抜け出すプログラムです。
#include <stdio.h>
void main(void)
{
int i = 0;
while (i < 10)
{
printf("i = %d\n", i);
i += 2;
goto label;
}
label:
printf("mainの実行終了\n");
}
i = 0
mainの実行終了
10行目に注目です。
ここのgoto文がなければiが10より大きい値になるまでループ処理が行われますが、goto文があることでループから抜け出しlabelへと移動しています。
このプログラムのgoto文はbreak文とほぼ同じ役割をしています。
続いて、goto文でループ処理を行うこともできます。
#include <stdio.h>
void main(void)
{
int i = 0;
loop:
if (i < 10)
{
printf("i = %d\n", i);
i += 2;
goto loop;
}
printf("mainの実行終了\n");
}
i = 0
i = 2
i = 4
i = 6
i = 8
mainの実行終了
7行目~12行目でiが10より大きい値になるまで何度もloopへと移動しています。
このように、goto文を使ってループさせることも可能です。
goto文は禁止?
goto文今でも使えるじゃん。
なんでgoto文って禁止なの?
禁止ではありませんが、様々な理由から使用は控えられています。
今でも問題なくgoto文を使用してプログラムを作成・実行することは可能です。
しかし、様々な理由からgoto文は嫌われています。
そんなgoto文が嫌われている主な理由を2つ紹介します。
めちゃくちゃなコードになってしまう
プログラムは上から実行されるので、読むときも上から読んでいきます。
しかし、プログラム内にgoto文が3つも4つもあったらどうでしょうか…
上から読んでいるのに下に移動、次は上に移動、次は中間地点に移動…とあちらこちらに移動されるとわけが分からなくなってしまいます。
また、同じラベル名が複数ある場合にはどこに移動するのか全く把握できません。
つまり、プログラムの処理の流れや構造がかなり理解しずらくなってしまいます。
ちなみに、めちゃくちゃになってしまったコードのことを
スパゲッティコードと呼びます。
プログラムの暴走やバグの発生に繋がる
goto文を使うことでgoto文を使用している関数内ならばどこにでも移動できてしまいます。
どこにでも移動できるということは、強引な処理が可能となってしまいます。
普段ではできないことも無理矢理できてしまうので、プログラムがとんでもない処理を行ってしまったり、予期せぬバグを発生させてしまいます。
まとめ
goto文は、一応使えるけどよっぽどの理由がないかぎり使用は控えたほうがいいですね…
今回はここまでです。
ちゃとら(・ω・)/