読者です 読者をやめる 読者になる 読者になる

明日への断片

ゲーム制作やプログラミング関する記事を中心に更新していこうと思います。

24欠片目:C言語の禁忌、goto文

 こんにちは。最近やりたいゲームが多すぎて困っているvoidです!時間とお金がたくさん欲しいです。

ブログのデザインを変更して見ました。(PC表示)
前回のは少し暗かったかなーと思ったので

goto文とは?

 初めに言っておきますが、gotoは「後藤」ではないので気を付けてください。全国の後藤さんファンの皆様、ごめんなさい。

goto(ゴートゥー)とは英語の go to (~へ行く)そのままの意味です。

goto ラベル名;

と書くことで、ラベルのところに一気に処理を飛ばす機能を持ちます。

ラベルとは

LABEL: // ラベル名の後にコロン

このように書くことが出来ます。


実例

/* goto01.c */

#include <stdio.h>

int main(void)
{
	int a = 0;
	int b = 0;
	int c = 0;

	a = 10;

	goto LABEL;  // LABELまで処理を飛ばす!
	b = 20;    // 飛ばされたのでこの文は処理されない‼

LABEL:         
	c = a + b;   // b = 20;が実行されていないのでbは0のまま!

	printf("c = %d\n", c);

        return 0;

}

このプログラムの実行結果は10となります。

まず初めに、変数a,b,cが0で初期化。
次に、a = 10;が処理され、aの値が10になります。(ここまでは普通です。)

次に!(ここがポイントです)goto LABELによってLABEL:まで飛ばします。そのせいで、b = 20は実行されません。
その結果、a(10) とb(0のまま)の和は10ですね。

なぜ嫌われるのか

goto文はC言語界ではかなりの嫌われ者です。goto文をむやみに使うことは禁止されているそうです。では、一体なぜそんなにも嫌われてしまったのでしょう?

goto ラベル名;

と書くだけで、好きな時に、好きな処理に飛ばすことが出来るんですよ?上記の例のように、処理を飛ばすだけでなく、プログラムの先頭まで戻ったり、色んな事が出来てしまう万能な子なんですよ?

はい。だからC言語では嫌われてしまうのです!


C言語構造化プログラミングと言って、簡単に言うと、①上から順番に、②if文等で分岐、③for,whileでの繰り返し、の3つを使ってプログラムを書くことで、分かりやすく処理を書いていこうというよなものです。


goto文を使ってしまうと処理順序や構造が複雑化してしまいます。そのようなプログラムのコードをスパゲッティコードなんて呼んだりもします。スパゲッティコードは可読性(プログラムの読みやすさ)が低下し、メンテナンス性(手直ししやすさ)が悪くなりますので、回避しなくてはならないのです。




結論:gotoはスパゲッティ職人なので、基本的に使うのは避けましょう。

goto NAPOLI;

じゃ存在価値はないのか?

goto「 (´・ω・`)... 」

そうとは、一概に言い切ることは出来ません。

多重ループを一気に抜ける際はgoto文の方がスマートに書けたりするそうです。


goto「 (`・ω・´)! 」

例)

/* gotoなしで2重ループを脱出 */

int main(void)
{

	int i;
	int j;

	for  (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (i == 5 && j == 2)	// iが5でjが2の時にループを抜けたい!
			{
				break;		// 内側のfor文を抜け、外側のループに戻る
			}
		}
		if (i == 5 && j == 2)		// iが5でjが2の時にループを抜けたい(2回目...)
		{
			break;			// 外側のfor文を抜ける
		}
	}
        return 0;
}
/* goto文を使ってループを脱出 */

int main(void)
{

	int i;
	int j;

	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (i == 5 && j == 2)	// iが5でjが2の時にループを抜けたい!
			{
				goto END;	// ENDラベル(ループの外)へ一気に脱出!
			}
		}
	}

        END:
        return 0;
}

この2つのプログラムでは、恐らく後者のgoto文を使った方が見やすいと言えるでしょう。

goto「 (^ω^) 」

まぁ、とは言っても基本的に多用は避けて方がいいとは思います。


goto「 (´・ω・`) 」

明日に向かってゴーゴーゴー

今日はこんな感じで。ではまた!

goto TOMORROW;