• ベストアンサー

exitとreturnの使い分け

通常の開発でexitは使ってもいいのでしょうか? main以外の関数でbool型でmainに処理を戻しプログラムを終了させるのと、関数内でexitを使い処理を終了させることの違いと具体的にどういう場合に使い分けたらいいのかを教えてください。 できるだけ詳しく教えてもらえるとうれしいです。

  • yruri
  • お礼率40% (21/52)

質問者が選んだベストアンサー

  • ベストアンサー
  • drmoreau
  • ベストアンサー率41% (33/79)
回答No.3

ANSI規格では、mainの中で使う限りにおいては、returnとexitに関しては違いがありません。 関数の中で使った場合、returnはその関数を呼び出した関数に対して値を返すのに対し、exitはそのプログラムを呼び出した他のプログラム(OSや他のプロセス、サービスなど)に対して値を返します。 これらを念頭において使い分ければいいと思います。 私の場合は、exitはmainと各関数でプログラムの仕様上エラーに対処できない場合にプログラムを強制終了したい場所で使います。 それ以外の場所ではreturnを使います。

yruri
質問者

補足

とても分かりやすかったです、ありがとうございます。 エラー処理の仕方によって使い分けたらよいということでしょうか? 余談ですが、皆様親切で優劣がつけ難く困ってしまいます、感謝します。もう暫く回答を募らせて頂いて質問を閉じさせて頂くつもりです。

その他の回答 (4)

  • drmoreau
  • ベストアンサー率41% (33/79)
回答No.5

私の場合、main以外の下位関数では、次のように場合わけして組んでいます。 1.エラーで強制終了が必要な場合exitでエラーコードを返してプログラムを終了 2.エラーがその関数内で修復可能であればreturnで正常終了のコードを返す 3.その関数内でエラー処理できないが、呼び出しもとの関数でエラー処理できれば、returnでエラーに対応したエラーコードを返し、上位の関数でエラー処理をする

yruri
質問者

お礼

なるほど、やはりできる限り上位の関数に処理を戻した方がいいということでしょうか。 なかなか本には載っていない価値のあるアドバイスを頂けてうれしいです。 ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> newで生成したものはexitで終了するとどうなるのでしょうか? どうにもなりません。これはmain関数からreturnした場合でも同じです。 newで生成したものは、プログラマの責任でdeleteする必要があります。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

bool型を使うとのことなのでC++だと判断します。(C99の可能性もありますが...) exit関数でプログラムを終了させると、自動記憶域に生成したインスタンスのデストラクタが呼ばれません。デストラクタで行っている処理によっては、かなり深刻な不具合になる可能性があります。 できれば例外をスローして、main関数でreturnする方が安全です。

yruri
質問者

補足

なるほどデストラクタの件大変参考になりました。 的が外れていたらすみませんが、newで生成したものはexitで終了するとどうなるのでしょうか? WM_DESTROY等で明示的にdeleteしないとどうなるのでしょうか?

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

サブルーチン内にEXIT命令を入れるのは避けるべきです。 非常にデバッグしにくくなりますので。 その関数が正常に終了したかどうかをReturn命令で与えてやってメインの方でその数値で処理方式を変更してやるのが通常です。

関連するQ&A

  • C言語でmain関数でのreturnとexit

    C言語でmain関数でのreturnとexitは同等とされてますが、 それは『プログラムを呼び出した元の動作』も同じですか? 例えばshellやOSから見て、割り当てメモリ開放などの点で returnで終了したプログラムの後処理と exitで終了したプログラムの後処理は 全く同じになりますか?

  • exitってどう使うの?

    exitを使いたいのですが、プログラムが終了しません。 コンパイルも通りません。 警告:コードは効果を持たない(関数 exit) エラー:ステートメントにセミコロンが無い(関数 exit) と出ます。 windowsでC言語書いています。 入力した数値分「警告」を表示するプログラムなのですが #include <stdio.h> #include <stdlib.h> void exit(int x) { while(x-- > 0){ if(x==0){ printf("警告!\n"); exit 0; } printf("警告!残り%d回。\n", x); } } int main() //警告を表示する回数を変数に代入するプログラムvoid exitのxに渡す。 どうすればexitの位置でプログラムが終了するようにできるのでしょうか。 どなたか教えていただけないでしょうか。

  • EXIT関数のGcc3.2.3でのコンパイルエラー

    mainで異常終了するときにexit関数で終了するHP-UX Cのプログラムがあります。 これをGcc3.2.3でコンパイルすると下記のエラーとなります. これをコンパイルエラーとしない方法を教えてください。 C言語の書物上は、引数なしでもOKなのですが。 「関数 `exit' への引数が少なすぎます」

  • unix の exit 1, exit 0について

    unixの超初心者です。 viで作るプログラムで、if 構文の中に、exit 0 とexit 1がありますが、exit 0は、正常終了。 exit 1は、異常終了と言葉では理解してますが、よくわかりません。 (1)じぶんの理解では、exit 0がif文がとりあえず終わったと、 そして、exit 1は、後にも続くかも?みたいに理解してるんですが、elseの後なので(elseがあっても入ってない時がある)。 どうでしょうか? (2)それと これは fiの前に入れるものなんでしょうか? 最後のexit 0は fiの後に入れてるようですが?間違い? (3)if,else,fi. if,else,fi. if,else,fiと続く場合exit 1 を入れてないif 文もありますが、どうちがうんでしょう? (4)exit だけの場合との違いは、何なんでしょうか? すごく混乱してます、よろしくお教えください。

  • exit exit(); 言語構造

    exitの使い方が良く分かりません。 >exit は言語構造です 言語構造って何ですか? >status を指定しない場合は括弧なしでコールできます と書いてありますが、 下の方の例2 // 正常終了 exit; exit(); exit(0); exit();ということは、 status を指定しない場合は括弧ありでもコールできる、 ということでしょうか? つまり、下記3つは、何れも同じ意味、ということでしょうか? exit; exit(); exit(0); また、「0 から 254 までの終了ステータスは表示されない」、とのことですが、 具体的にどうやって使うのでしょうか?(取得するのでしょうか?) メッセージを出力、と書かれているので、 終了ステータスに応じて、画面には表示させずに、メッセージをログなどに残せるのでしょうか? ▽PHP: exit - Manual   http://jp.php.net/manual/ja/function.exit.php

    • ベストアンサー
    • PHP
  • System.exit(0);について

    System.exit(0);について mainフレームから呼び出した子フレームをexit(0)で消すとどちらのフレームも消えてしまいます。 mainフレームを消さない方法を探しているのですが見つかりません。 ただし、this.etDefaultCloseOperation(JFrame.DISEPOSE_ON_CLOSE);で×を押して消すのではなく、終了ボタンを付けて、actionPerformed内で終了したいです。 また、setVisible(false);のように、メモリが残った状態にもしたくありません。 (メモリが残らないように子フレームを消したいです。) ご存知の方おられましたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • main関数の戻り値

    C言語のmain関数の戻り値はint型ですよね。 私もそういう決まりだと思って守ってきました。 しかし、「mainが戻り値を返すって、どこに返すの?」ということが、私は理解できていません。 私が調べたところでは、「ホスト実行環境」という言葉がこの問題に関係あるようですが、この言葉の意味はよくわからないですし、似た言葉で「ホスト環境」ということばがあるのですが意味も関係もわかりません。 これらは、OSとは違うと思うんですが、自信はありません。 それでも、ない知識を振り絞っていろいろ考えてみると、次のようなことらしいのですが、正しいでしょうか。 ・OSはプログラムの実行に先立ちホスト実行環境を作る。 ・静的記憶域のオブジェクトを初期化するのはホスト実行環境である。 ・関数が、main関数を呼ぶことは可能である。(以下では、main関数が関数から呼ばれる場合は除く。) ・main関数を呼ぶのは、ホスト実行環境が行なう。 ・main関数の中のreturnによってプログラムが終了するのと、exit関数でプログラムが終了することに違いはない。 ・main関数の戻り値は、ホスト実行環境に返される。 ・returnによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・exitによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・必ずexitで値が返されるならば、main関数の中にreturnはなくてもよい。 main関数からの戻り値をどうしようと構わないんだと思うんですが、皆さんの経験の中で、実例としてこういうふうに使われる、というのは何かないのでしょうか。 (ホスト実行環境に値が返される、といっても無視するのでは意味はないと思うのです。 その値の使用例としては、 0が返ってくると「プログラムは正常終了しました。」と表示するとか、0以外の値が返されると別のプログラムが走るとか、 そういうことだと思うんですが。)

  • エラー処理,メモリ開放,exit

    こんばんは。現在、次のような C のプログラムを作っています。 ・ 動的にメモリを確保した配列や構造体が複数ある。 ・ しばしば,関数呼び出しのネストが複数(2~4) になる。 ・ ”エラーチェック => エラーなら終了” という動作が多い。 このようなプログラムで,"エラー => プログラム終了" の際,動的に確保したメモリを,関数呼び出しのネストを(return文 で)遡って,全て開放すべきでしょうか。 このようにすると,あまりにプログラムが煩雑になるので,今は "エラー => exit(-1) で直ちに終了" としています。 しかし改めて C の教科書を見ると,exit の時,オープンされているファイルやストリームについては,捨てられ,あるいは閉じられる,と書いてありますが,メモリについては何も書かれていないので,どうするべきか少し悩んでいます。 みなさんはこんな場合,どうされていますでしょうか? ご意見を下されば幸いです。よろしくお願いします。

  • Perlのexitについて

    こんにちは、現在シェルスクリプトからperlを呼び出し、 その実行結果を受け取るというシンプルな所で悩んでいます。 Perlからプログラムの終了時にexitで 値を返しているのですが、どの値を返しても0が返ってきます。 受け取り側はシェルスクリプトです。 exitには何か特殊な要素があるのでしょうか? ご存知の方がいたらご教授下さい。 よろしくお願いします。 # #perlのソース #(i=0の場合・i=1の場合) # if(i == 1) { exit 1; } exit 0;

    • ベストアンサー
    • Perl
  • returnの使い方

    c言語初心者です。 returnを使って違う関数からはじめのmainのプログラムに戻したいのですが、引数の使い方がいまいちよくわかりません。 どなたか良い方法を教えてください。 よろしくおねがいします。

専門家に質問してみよう