switch文内のgoto文について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ふぅ
記事: 15
登録日時: 8年前

switch文内のgoto文について

#1

投稿記事 by ふぅ » 8年前

簡単な事でトピックを立てて申し訳ないです。
Dxライブラリでゲームを作っています。

ゲームプログラム内の処理で、switch文を使っているのですが、終了処理でメイン関数ソースコードの最後に記述した
DxLib_End関数を通らせたい場合、goto文でswitch文外のDxLib_End関数直前にジャンプしてもいいものでしょうか?
goto文はできるだけ使わないほうがいいと聞いたのですが。

アバター
へろりくしょん
記事: 92
登録日時: 9年前
住所: 福岡

Re: switch文内のgoto文について

#2

投稿記事 by へろりくしょん » 8年前

ふぅ さんが書きました:ゲームプログラム内の処理で、switch文を使っているのですが、終了処理でメイン関数ソースコードの最後に記述した
DxLib_End関数を通らせたい場合、goto文でswitch文外のDxLib_End関数直前にジャンプしてもいいものでしょうか?。
いいですよ。
自分のプログラムですから、自由気ままに書けばいいんです。
ふぅ さんが書きました:goto文はできるだけ使わないほうがいいと聞いたのですが。
「できるだけ使わない方がいい」と、「使ってはならない」は別物です。


goto 文が嫌悪される1番の理由は、処理がぶつ切りになってしまう事です。
特に、前方・後方両方への goto 文が混在する場合、処理を追うのも一苦労です。
また、ローカル変数の内容の遷移を追いかけるのにも、大変な思いをします。

こういった理由により、バグを埋め込みやすくなる、プログラムの堅牢性にダメージを与えやすい、可読性の低下を招く。
といった事が起こりえます。


だからと言って、使ってはならないというのは、少々乱暴な物言いだと思います。
用途を限定して注意深く使えば、非常に便利ですし、goto 文を使わずに書くよりも、スマートに書けることもあります。

例えば、エラー処理などで、それまでの処理を破棄して、一気に関数の最後までジャンプする。 等ですね。
今回の例は、その典型例だと思いますよ。

goto 文が本当に必要な局面というのは、そうそうありませんが、それが良いと思うのであれば、好きにしたらいいと思いますよ。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: switch文内のgoto文について

#3

投稿記事 by ISLe » 8年前

breakでswitchブロックから飛び出せるわけで、DxLib_Endを呼び出すまでのあいだに何があるのか、というのが気にはなりますけど。

わたしの感覚ではそこには何も無いはずなので。

実のところgotoを使って良いかどうかじゃなくて、メインループを抜ける方法が分からないということなのかな、と。

ふぅ
記事: 15
登録日時: 8年前

Re: switch文内のgoto文について

#4

投稿記事 by ふぅ » 8年前

へろりーなさんありがとうございます!
ひとまずgoto文を使ってみようと思います。
ISLe さんが書きました:breakでswitchブロックから飛び出せるわけで、DxLib_Endを呼び出すまでのあいだに何があるのか、というのが気にはなりますけど。

わたしの感覚ではそこには何も無いはずなので。

実のところgotoを使って良いかどうかじゃなくて、メインループを抜ける方法が分からないということなのかな、と。
メインループの中でswitch文を使っている場合、breakだとswitch文のcaseの最後に記述するbreak文とかぶってしまい、swicthから抜けられないのですが何かgoto文の他にswicth文から抜ける方法はありますか?

アバター
a5ua
記事: 199
登録日時: 9年前

Re: switch文内のgoto文について

#5

投稿記事 by a5ua » 8年前

ふぅ さんが書きました: メインループの中でswitch文を使っている場合、breakだとswitch文のcaseの最後に記述するbreak文とかぶってしまい、swicthから抜けられないのですが何かgoto文の他にswicth文から抜ける方法はありますか?
一例ですが、こんなコードでどうでしょう。

コード:

enum STATE {TITLE, STAGE, END};

STATE state = TITLE;
bool running = true;

while (running) {
	switch (state) {
	case TITLE:
		// タイトル処理
		if (ステージが選択された) {
			state = STAGE;
		} else if (終了が選択された) {
			state = END;
		}
		break;
	case STAGE:
		// ステージ処理
		state = TITLE;
		break;
	case END:
		// 終了処理
		running = false;
		break;
	}
}

ふぅ
記事: 15
登録日時: 8年前

Re: switch文内のgoto文について

#6

投稿記事 by ふぅ » 8年前

a5uaさん

なるほど、whileの判定式を偽にしてやればよかったんですね。
ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る