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;