C言語

【C言語】goto文は禁止?危険?goto文について解説【初心者】

c-language-goto.png

<この記事について>

  • この記事を読むことで、goto文がどんなものなのかを知ることができ、なぜgoto文が嫌われているのかが分かります。
  • 結論としては、goto文を使うと同じラベル名の場所へ移動することができます。禁止されてはいませんが、様々な理由からgoto文の使用は避けられています。

こんにちは!こんばんは!

ちゃとらです(・ω・)/

goto文…プログラミング経験者の方ならもしかしたら一度は耳にしたことがあるかもしれません。

処理としては便利そうだけど、どうして嫌われているのでしょうか?

ちゃとら

goto文の機能と嫌われている理由について解説していきます!

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文について

  1. goto文は同じラベル名の場所へ移動することができるので、ループ処理からの抜け出しや逆にループ処理を行うことなどができる。
  2. 禁止されてはいないが、コードが読みにくくなってしまったり思いがけない処理をしてしまうなどの理由で使用を避けられている。
ちゃとら

goto文は、一応使えるけどよっぽどの理由がないかぎり使用は控えたほうがいいですね…

今回はここまでです。

ちゃとら(・ω・)/