• ベストアンサー

main関数終了時のreturnの意味は?

質問の題名通り、main関数終了時のreturnの意味が知りたいです。いつもは参考書に書いてある通り、return 0とやっていたのですが、参考書のサンプルプログラムでreturn 1というのがでてきた為、少し混乱しました。 参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。よろしくお願いいたします。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.6

# 4です。 まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。 戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。 例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います) コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。 1を伝えられたOSが何をするかは環境(OS)によります。 gccは、Windows版もLinux版も各UNIX版もあるようなコンパイラですから、その版によって違う可能性があります。 ちなみに、手元の Minimalist GNU for Windows では 1 は EXIT_FAILURE でした=つまり前述のような失敗。 別のOS上のgccでは別の値にポートされている可能性も否定はできません。 C言語が保証しているのは、EXIT_SUCCESSを返したとき、その環境では成功と判断してくれるだろう値を返すことと、EXIT_FAILUREのときは失敗と判断してくれるだろう値を返すことだけです。 0は通常EXIT_SUCCESSですが、1はEXIT_FAILURE とは限りません(現実的には 0 と 1 が大半だと思いますが、EXIT_FAILUREが-1とかでも違反ではないです)。 但し、実際に判断できるかはOSにもよりますし、呼び出したプロセスがどう判断するかにもよります。 なお、Windows や Linux, その他私の知っている UNIX では、1を返されたからといって必ず何かが行われるということはありません。 前述のように、別のプログラム等から呼び出された場合に、そのプログラムが失敗と判断して何か処理を行う可能性はありますが、これらはあくまで呼び出し元のプログラムによります。 ITRON等の組込みOSでは、main が値を返す事は通常ありません。 憶測ですが、参考書のサンプルで return 1;となっているのは、例えば argv が求めているものと違うとか、fopen に失敗したとか、そういうケースではありませんか。 そういう異常処理が発生した場合に、もしも呼び出したプログラムがいたらそれを伝えられるように、EXIT_SUCCESS (0)以外の値を返すのは慣習です。 具体的にどんな値を返すかは、プログラムの設計次第になってしまいますが、1や-1を返したり、失敗原因ごとに決めた値を返したりします。 汎用性を重視するならEXIT_FAILURE等もありますが、知名度もやや低いですし、0以外なら何でもいいという認識の人も多いように思いますので、サンプルは単に1を返しているのではないかと。

その他の回答 (7)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.8

returnで何を返そうが内部の動きは変りません. 影響があるのは外部です. で,外部(OSなど)が返された値をどうするかといえば,OSによって違います. たいていは,起動したプログラムに伝えます.そのプログラムが伝わった値をどうするかは,プログラマが決めることです. 無視することもあります.あるいは,そもそもプログラムを起動しておいて終了ステータスをOSから受け取らないプログラムもあります.

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

#5です。 > 使用しているコンパイラはgccです、EXIT_FAILUREの時はこんな風に内部的な動きとかは無いのでしょうか? gccはコンパイラだけですので、標準ライブラリないしはスタートアップがどうなっているかが重要です。

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

main関数内のreturnで返す値は、exitに引数として渡す値と同じ意味です。すなわち、EXIT_SUCCESS(=0)であればプログラムが成功したことを、EXIT_FAILUREであれば失敗したことを意味し、それ以外の値は処理系によって意味が異なります。 return 1;と書いた場合、EXIT_FAILUREがたまたま1に定義されていれば失敗を意味しますし、それ以外なら処理系定義ですので、全く移植性のないコードということになります。 また、mainの返却値型はint型が基本ですが、特定の状況では他の型、例えばvoid型の場合もあり得ます。その状況というのは、 1. 組み込み用の処理系など、フリースタンディング環境である場合、処理系定義の型となり得る。 2. C99(C言語の第2版)であれば処理系定義の型となり得る。 3. 処理系が標準規格に合致していない場合、あらゆる可能性が考えられる。 さらに、main関数にreturn文がない場合でも、何らかの値が返されるわけですが、その値は不定(未規定)になります。ただし、C99やC++であれば0が返されます。 使用されている処理系を補足していただければ、それに特化した説明ができるかもしれません。 参考書は、特定の処理系を使うことを前提としたものではありませんか?もしそうでなければ、その参考書を参考にするのは、今すぐやめましょう。

C_32767
質問者

補足

使用しているコンパイラはgccです、EXIT_FAILUREの時はこんな風に内部的な動きとかは無いのでしょうか? 1を返しても0を返しても同じということなのでしょうか?

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

一応、C言語仕様上で、<stdlib.h>に EXIT_SUCCESS / EXIT_FAILURE というマクロの定義があります。 (ISO/IEC9899:1999 7.20 General utilities <stdlib.h>) 実際の値は、環境に依存しますが、 VC.NET2003では以下の値で定義されています。 #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 ※成功時にゼロを返すのは、C言語の「お約束」です。 また、main 関数は、return を省略すると 0 を返す仕様です。 戻り値が int 互換でない場合の動作は未規定です。 <5.1.2.2.3 Program termination> 通常は、シェルスクリプトやバッチファイルなどから、 結果を受け取る場合などにこの値を利用するのは、 既に説明のあるとおりです。

C_32767
質問者

補足

1を返した時の内部的な動きが知りたいのですが1を返したときはどのようなことになるのでしょうか?

  • suseimei
  • ベストアンサー率35% (17/48)
回答No.3

> 参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。 面白いとことに注目されましたね。詳細は、次のURL情報を参考にされるとよいと思いますが、 http://ttoyota.com/freetutorial/cppnovice02.htm Microsoftなどの最新環境では、標準言語仕様に準拠するため、このあたりのコンパイラ実装部が多少変更されているようです。 ちなみに、returnを記述しない場合、次のようなアセンブラーコードが追加されることがあるようです。 xor eax, eax これはeaxレジスタを0クリアーするコードです。

C_32767
質問者

お礼

ご回答ありがとうございました。 アセンブラーコードも勉強したほうが理解が深まるようですね。参考URL、とても勉強になりました。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

Cのプログラムは,何か別のものに呼び出されて起動します.終了時には,呼び出し側に情報を伝えるためreturn文を使用します. 通常はOS(を経由して,そのプログラムを起動した親プロセス)に正常終了/エラー終了の別を伝えます. 本当は,Cの規格書ではこのあたりには厳密な専門用語を使った規定が書いてあります. mainのリターン値の使い分けについては明確な規定がありません. 正常終了は0,というくらいです.0以外の値のエラーコードはC言語的には決まってないので,OSごとのアプリケーション作成慣習に従うと言うことになります.正常/エラーの二つしか終了状態を区別しないようなプログラムでは0と1を使うのが普通ですね. sysexits.hというのがあって終了コードを定義していますが,これを使うことがC言語的に義務ずけられているわけではありません. OSが存在しない組み込みなどでは誰から呼び出されたわけでもなくCプログラムが動き出すという世界もありますが,そのような場合はreturnしませんね.returnするしないにもかかわらず,mainはint型というお約束です.mainがvoidになっているというのは駄目な参考書/教科書を見分ける参考指標でもあります. ただし,void main(・・・)として書いても,コンパイルはできるし作られたプログラムは動作はしますが.

C_32767
質問者

補足

もしも1を返し、OSにそれを伝えた場合はどのような動きがあるのでしょうか?

  • techa
  • ベストアンサー率60% (41/68)
回答No.1

C言語でのmain()も関数であり、戻り値を要しない場合にはvoid型での利用が可能です。 ただ、コマンドラインで利用する場合などでは int型で定義して return 0; return 1; などのようにすれば、標準出力としてその値が返されるので、結果に応じた処理が可能となるのです。 ここで0を返すか1を返すかは、ソフト作成者の思想に任されているので、あまり深く考える必要はないようにおもいます。 ちなみに私は、エラー終了したのでない限り1を返すように記述しています。 利用は真=1、偽=0というのが思想的にわかりやすいからです。(偽=0というのは一般的ですが、真≠0ともいえますから、必ずしも1とは限りませんが)

C_32767
質問者

お礼

ご回答ありがとうございました。 returnでどちらを返してもよいということですか。 なんだか難しいですね。

関連するQ&A