
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を返しているのではないかと。
No.8
- 回答日時:
returnで何を返そうが内部の動きは変りません.
影響があるのは外部です.
で,外部(OSなど)が返された値をどうするかといえば,OSによって違います.
たいていは,起動したプログラムに伝えます.そのプログラムが伝わった値をどうするかは,プログラマが決めることです.
無視することもあります.あるいは,そもそもプログラムを起動しておいて終了ステータスをOSから受け取らないプログラムもあります.
No.7
- 回答日時:
#5です。
> 使用しているコンパイラはgccです、EXIT_FAILUREの時はこんな風に内部的な動きとかは無いのでしょうか?
gccはコンパイラだけですので、標準ライブラリないしはスタートアップがどうなっているかが重要です。
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が返されます。
使用されている処理系を補足していただければ、それに特化した説明ができるかもしれません。
参考書は、特定の処理系を使うことを前提としたものではありませんか?もしそうでなければ、その参考書を参考にするのは、今すぐやめましょう。
この回答への補足
使用しているコンパイラはgccです、EXIT_FAILUREの時はこんな風に内部的な動きとかは無いのでしょうか?
1を返しても0を返しても同じということなのでしょうか?
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>
通常は、シェルスクリプトやバッチファイルなどから、
結果を受け取る場合などにこの値を利用するのは、
既に説明のあるとおりです。
No.3
- 回答日時:
> 参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。
面白いとことに注目されましたね。詳細は、次のURL情報を参考にされるとよいと思いますが、
http://ttoyota.com/freetutorial/cppnovice02.htm
Microsoftなどの最新環境では、標準言語仕様に準拠するため、このあたりのコンパイラ実装部が多少変更されているようです。
ちなみに、returnを記述しない場合、次のようなアセンブラーコードが追加されることがあるようです。
xor eax, eax
これはeaxレジスタを0クリアーするコードです。
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(・・・)として書いても,コンパイルはできるし作られたプログラムは動作はしますが.
No.1
- 回答日時:
C言語でのmain()も関数であり、戻り値を要しない場合にはvoid型での利用が可能です。
ただ、コマンドラインで利用する場合などでは
int型で定義して
return 0;
return 1;
などのようにすれば、標準出力としてその値が返されるので、結果に応じた処理が可能となるのです。
ここで0を返すか1を返すかは、ソフト作成者の思想に任されているので、あまり深く考える必要はないようにおもいます。
ちなみに私は、エラー終了したのでない限り1を返すように記述しています。
利用は真=1、偽=0というのが思想的にわかりやすいからです。(偽=0というのは一般的ですが、真≠0ともいえますから、必ずしも1とは限りませんが)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Sublime Text 3でのFortranプロ...
-
変数の値が勝手に変化する原因
-
3つの整数のうち奇数のみを表示...
-
Tiny Basicのプログラムです。。
-
PICのプログラムでsrandを使う...
-
【JAVA】数字をひし形に出力す...
-
CommonLispでハノイの塔の円盤...
-
JCLの基本について教えてください
-
main関数終了時のreturnの意味は?
-
プログラミング(自由課題)
-
プログラムの実行回数
-
COBOLのピリオド
-
vb.netで「objWinds」がエラー...
-
360度を超える角度
-
プログラミング
-
fortran if文
-
10進ベーシックの質問
-
プログラミング
-
Fortran90についての質問です。
-
素人なのですが、プログラマに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数の値が勝手に変化する原因
-
プログラミング
-
COBOLのピリオド
-
360度を超える角度
-
fortran if文
-
JCLの基本について教えてください
-
4桁の数値を逆に表示されるプ...
-
Sublime Text 3でのFortranプロ...
-
素人なのですが、プログラマに...
-
【JAVA】数字をひし形に出力す...
-
10進ベーシックの質問
-
N88basicを用いたGPIB制御
-
ロトカ=ヴォルテラ方程式 をC...
-
3つの整数のうち奇数のみを表示...
-
fortranの編集記述子
-
プログラミング
-
Fortran90についての質問です。
-
プログラミングの課題で1万円か...
-
main関数終了時のreturnの意味は?
-
PICのプログラムでsrandを使う...
おすすめ情報