Q質問
A 回答 (8件)
- 最新から表示
- 回答順に表示
- ベストアンサーのみ表示
No.8
- 回答日時:2006/04/09 19:32
returnで何を返そうが内部の動きは変りません.
影響があるのは外部です.
で,外部(OSなど)が返された値をどうするかといえば,OSによって違います.
たいていは,起動したプログラムに伝えます.そのプログラムが伝わった値をどうするかは,プログラマが決めることです.
無視することもあります.あるいは,そもそもプログラムを起動しておいて終了ステータスをOSから受け取らないプログラムもあります.
No.7
- 回答日時:2006/04/09 18:24
#5です。
> 使用しているコンパイラはgccです、EXIT_FAILUREの時はこんな風に内部的な動きとかは無いのでしょうか?
gccはコンパイラだけですので、標準ライブラリないしはスタートアップがどうなっているかが重要です。
No.6ベストアンサー
- 回答日時:2006/04/09 14:24
# 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を返しているのではないかと。
No.5ベストアンサー
- 回答日時:2006/04/06 17:46
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が返されます。
使用されている処理系を補足していただければ、それに特化した説明ができるかもしれません。
参考書は、特定の処理系を使うことを前提としたものではありませんか?もしそうでなければ、その参考書を参考にするのは、今すぐやめましょう。
No.4
- 回答日時:2006/04/06 12:02
一応、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>
通常は、シェルスクリプトやバッチファイルなどから、
結果を受け取る場合などにこの値を利用するのは、
既に説明のあるとおりです。
No.3
- 回答日時:2006/04/06 11:50
> 参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。
面白いとことに注目されましたね。詳細は、次のURL情報を参考にされるとよいと思いますが、
http://ttoyota.com/freetutorial/cppnovice02.htm
Microsoftなどの最新環境では、標準言語仕様に準拠するため、このあたりのコンパイラ実装部が多少変更されているようです。
ちなみに、returnを記述しない場合、次のようなアセンブラーコードが追加されることがあるようです。
xor eax, eax
これはeaxレジスタを0クリアーするコードです。
No.2
- 回答日時:2006/04/06 11:26
Cのプログラムは,何か別のものに呼び出されて起動します.終了時には,呼び出し側に情報を伝えるためreturn文を使用します.
通常はOS(を経由して,そのプログラムを起動した親プロセス)に正常終了/エラー終了の別を伝えます.
本当は,Cの規格書ではこのあたりには厳密な専門用語を使った規定が書いてあります.
mainのリターン値の使い分けについては明確な規定がありません.
正常終了は0,というくらいです.0以外の値のエラーコードはC言語的には決まってないので,OSごとのアプリケーション作成慣習に従うと言うことになります.正常/エラーの二つしか終了状態を区別しないようなプログラムでは0と1を使うのが普通ですね.
sysexits.hというのがあって終了コードを定義していますが,これを使うことがC言語的に義務ずけられているわけではありません.
OSが存在しない組み込みなどでは誰から呼び出されたわけでもなくCプログラムが動き出すという世界もありますが,そのような場合はreturnしませんね.returnするしないにもかかわらず,mainはint型というお約束です.mainがvoidになっているというのは駄目な参考書/教科書を見分ける参考指標でもあります.
ただし,void main(・・・)として書いても,コンパイルはできるし作られたプログラムは動作はしますが.
No.1
- 回答日時:2006/04/06 11:16
C言語でのmain()も関数であり、戻り値を要しない場合にはvoid型での利用が可能です。
ただ、コマンドラインで利用する場合などでは
int型で定義して
return 0;
return 1;
などのようにすれば、標準出力としてその値が返されるので、結果に応じた処理が可能となるのです。
ここで0を返すか1を返すかは、ソフト作成者の思想に任されているので、あまり深く考える必要はないようにおもいます。
ちなみに私は、エラー終了したのでない限り1を返すように記述しています。
利用は真=1、偽=0というのが思想的にわかりやすいからです。(偽=0というのは一般的ですが、真≠0ともいえますから、必ずしも1とは限りませんが)
このQ&Aを見た人はこんなQ&Aも見ています
- 4引数 戻り値 return文について
- 5戻り値の意味がわかりません…
- 6C言語 exitの使い方
- 7LNK2019: 未解決の外部シンボルのエラーが出る
- 8typedef enumの使い方を教えてください
- 9charと%c , %s の関係について
- 10基本アルゴリズムの『返す』の意味がわかりません。
- 11sleep()関数について
- 12エクセルで計算すると2.43E-19などと表示される。Eとは何ですか?
- 13グローバル変数のよくない使い方とその改良例
- 14intとlongは同じ?
- 15ファイルやディレクトリの存在確認を行う方法
- 16stdin,stdoutについて
- 17C言語のポインターに関する警告
- 18関数におけるif文とreturn文について
- 19三角関数の記述の仕方
- 20fatal error LNK1120: 外部参照 1 が未解決です
注目の記事
「遼河はるひさんからの質問のベストアンサーでもれなくプレゼント!」
遼河はるひさんとアンジャッシュ児嶋さんが3月21日(土)・22日(日)に北陸新幹線で金沢へ旅行します。
あなたの回答で、素敵な旅のプランを教えてあげてください!
あなたの回答がベストアンサーに選ばれると、全員にQUOカード5,000円分プレゼント!
おすすめ情報
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
- 4VC++6の「プロセスへアタッチ」...
- 5C言語32bitから64bitの移行につ...
- 6プログラミング能力認定試験は...
- 7ファイルやディレクトリの存在...
- 8ファイル名のリスト取得について2
- 9c言語でできること
- 10sleep()関数について
- 11wsprintf関数の使い方について
- 12wsprintfの書式制御文字列につ...
- 13wsprintf( ポインタ , "%d" , "...
- 14C言語にてプログラミングを行っ...
- 15C言語を独学でマスターした人。。
- 16VS_EXPBSLN_x64_jpnとは?
- 17アーカイブファイルについて。
- 18UTF8の文字
- 19main関数終了時のreturnの意味は?
- 20C、C++、C#の関係について
おすすめ情報
教えて!goo ウォッチ
-
- 携帯が「いくらご飯」に!?インパク
- スマートフォンが普及し、人それぞれの特徴が出るものといえば「...
-
- 転職者や新卒者は要注意。職場に存
- 新しい職場でネチネチ文句を言われたり、いじめられたりした経験...
- 今さら聞けないNISAのメリット・デ
- アニメイト池袋本店で行われた公開
- 北陸新幹線を使用した遼河はるひさ
- どんなスマホケースを使ってる?みんなの自慢のスマホケースを教えて!
- リクエストしたいオーダーを教えてください
- 一生行くことはなさそうな都道府県ランキング! 1位は佐賀県 あなたは何県?
- 募集資格は「猫が好きなこと」! 社内に猫がいる会社の求人が話題に
- 電子レンジの発煙・発火に注意 汚れや温め過ぎが原因
- 家族なのに相談なしなんて! 夫の衝動買い、いくらまでなら許せる?
- 世界一難しい職業!ひよこのオスとメスを見分けるお仕事 イギリスで不足
- 「ガスの消し忘れ」はスマホで確認してストップできるって、知ってる?
- 定年退職後、生活していくのに毎月どれぐらい必要だと思う?
- 人気長寿番組『笑点』が、高視聴率なのはなぜ?
公式facebook
公式twitter
- スマートフォンの”リモート”実機レンタルサービス
- 最新機種を含む300種類以上のスマートフォン実機を使って今すぐアプリ・サイトのテストが可能
>>無料でお試し
- レンタル端末を探す
- スマートフォン一覧
- 料金プランを選ぶ
- プロデューサー/ディレクター向け機能
- テスト機能一覧
- ・複数端末同時使用で一括デザイン検証
- ・静止画や動画をキャプチャ
- ・開発中アプリのインストール
- アプリ/WEB開発者向け機能
- ・Chrome for Androidの連携
- ・Eclipseの連携
- ・WebDriverの連携
- ・NativeDriverの連携
- ・Thrift API
- ・JenkinsなどのCIソフトウェアとの連携
- 役立つKnowledge Note
-
- ・Webサービスの性能テストの基礎
- ・Androidアプリの検証コストを最小化するテクニック
- ・試して学ぶ Backbone.js入門
- ・Raphael入門
もしも1を返し、OSにそれを伝えた場合はどのような動きがあるのでしょうか?
1を返した時の内部的な動きが知りたいのですが1を返したときはどのようなことになるのでしょうか?
使用しているコンパイラはgccです、EXIT_FAILUREの時はこんな風に内部的な動きとかは無いのでしょうか?
1を返しても0を返しても同じということなのでしょうか?