GOTO文の使い道について

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

GOTO文の使い道について

#1

投稿記事 by やってやるぞー » 7年前

 こんにちは~ やってやるぞーです!

 今回は、
 皆さんがGOTO文を使ったことがあるのか、
 その場合どのように使ったのか、

 などなど教えていただきたくトピックを立てました。
 よろしければGOTO文の使い道についての皆さんのご意見を教えていただきたいので、
 どんどんコメントお願いします!

 ついでですが、作品お披露目掲示板にて、
 3D迷路ゲーム「大脱出」を公開しております。
 よろしければ、そちらの方も拝見していただきたいと思います。

 それではまた~

アバター
durandal
記事: 11
登録日時: 7年前
住所: 長野県

Re: GOTO文の使い道について

#2

投稿記事 by durandal » 7年前

こんにちは。

私は確保したメモリの解放し忘れを防ぐために使用します。

コード:

char *p1 = NULL;   // グローバル
char *p2 = NULL;

int example() {
   
   p1 = malloc( 512 );   // メモリ確保
   if( NULL == p1 ) {
      return -1;   // エラー処理
   }

   p2 = malloc( 256 );   // メモリ確保
   if( NULL == p2 ) {
      free(  p1 );
      return -1;   // エラー処理
   }   

   if( -1 == func1() ) {
      /// func1関数が失敗したら
      goto error;   // ラベル"error"に飛ぶ
   }

   if( -1 == func2() ) {
      /// func2関数が失敗したら
      goto error;   // ラベル"error"に飛ぶ
   }

   return 0;

   // ラベル "error"
   error:
      free( p1 );   // メモリを開放
      free( p2 );
      return -1;   // -1を返す
}
こんな感じに関数内でなんらかの不具合が発生した際にgotoを使ってエラー処理をします。
これでメモリリークが発生しづらくなります。

ただC++が使えるならばスマートポインタを用いますし、Cしか使えなくても、もう少し工夫しますがw

やってやるぞー
記事: 22
登録日時: 7年前

Re: GOTO文の使い道について

#3

投稿記事 by やってやるぞー » 7年前

 shino0526yさん 貴重なご意見、ありがとうございます!

 何らかの理由で処理を飛ばしたい時に有効ということでしょうか?
 ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。

 ありがとうございます。
 他の使い道も何かあればどんどん教えてください!

 それではまた~

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: GOTO文の使い道について

#4

投稿記事 by YuO » 7年前

やってやるぞー さんが書きました: 何らかの理由で処理を飛ばしたい時に有効ということでしょうか?
 ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。
デストラクタの実行に相当するようなことをまとめて行うために,リソース解放処理を関数中にまとめておいて,returnの代わりにそこにgotoでジャンプさせて解放処理を行う,というものだと思います。
一般的なgotoの使い方の一つですね。
e.g.) MEM12-C. リソースの使用および解放の最中に発生するエラーが原因で関数を終了する場合に、Goto 連鎖の使用を検討する - JPCERT.CC

あとは,多重ループから一気に外に出るために使うくらいが現在利用価値のある使い方かと思います。
ただ,多重ループから出るために使う場合はループを関数化することで代替できるため,gotoを使わない方がよいことも多いです。

keito940
記事: 105
登録日時: 7年前

Re: GOTO文の使い道について

#5

投稿記事 by keito940 » 7年前

ちなみに、D言語では、Java同様にbreak文とcontinue文にラベルを付けられるようになって、goto文はほとんど出番がなくなったけど、
D言語は「現実的なプログラミング」を謳っているので、Javaでは面倒だった部分をD言語では、goto文で楽に処理できるようになってます。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: GOTO文の使い道について

#6

投稿記事 by Dixq (管理人) » 7年前

> ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。

そうですか?
リソースのクローズ等の後始末処理を関数の最後尾に書いて飛ばす処理はよく見ると思います。
逆にそれ以外の利用価値が私には見出せません。
try-catchする等代替手段はいくらでもあるので、goto文が必須な状況はほとんどないかと思います。

たなか

Re: GOTO文の使い道について

#7

投稿記事 by たなか » 7年前

オープンソースの有名どころを検索してみてはいかがでしょうか。例えば gcc の場合これだけ見つかります。前半はほとんどテストコードですけど。
https://github.com/gcc-mirror/gcc/searc ... goto&type=

他に思いつくのはLinux kernelとかchromiumでしょうかね。いい勉強になると思いますよ。

やってやるぞー
記事: 22
登録日時: 7年前

Re: GOTO文の使い道について

#8

投稿記事 by やってやるぞー » 7年前

 皆さん ご回答ありがとうございます!

 ↑のコードに関しては、関数のデストラクタという事でしょうか?
 他の方法に関しては、別の方法で代用できる場合がほとんどでgoto文の出番はなさそうですね。

 YuOさん、たなかさん ハイパーリンクを貼っていただきありがとうございます。
 他の方もありがとうございます。

 他の使い道も何かあればどんどん教えてください!

 それではまた~

 

ハードソフト二刀流

Re: GOTO文の使い道について

#9

投稿記事 by ハードソフト二刀流 » 7年前

無条件分岐なら他の人が言うようにエラー処理なんかで使いますけど、色々ある無条件分岐のうちgoto文はあんまり使わないです。使いにくいからです。関数内でしか飛べないんじゃ話にならないのでだいたいlongjmpです。それと、みんな普通に使ってる途中returnは要するに関数末尾への無条件分岐ですし、breakはループの終了直後への無条件分岐で、ただスペルがgotoではないというだけのものです。

やってやるぞー
記事: 22
登録日時: 7年前

Re: GOTO文の使い道について

#10

投稿記事 by やってやるぞー » 7年前

 ご回答ありがとうございます!

 今後とも、使い道等のアドバイスよろしくお願いします。

 それではまた~

返信

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