回答編集履歴
2
修正漏れ
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
`main`関数からの戻り値はプロセスの[終了ステータス](https://ja.wikipedia.org/wiki/%E7%B5%82%E4%BA%86%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9)になります。
|
2
2
|
|
3
|
-
プログラムの中にはプログラムの内部でプログラムを実行する(Cであれば`system`関数等)場合があります。呼び出す側のプロセスを親プロセス、呼び出される側のプロセスを子プロセスと言います。あるプログラムAが実行され、そのプロセスが動作中に、別のプログラムBを内部で実行したとしましょう。その時、プロセスは親子関係にあり、親プロセスではプログラムAが、子プロセスではプログラムBが動作することになります。プログラムBのコードを全て実行し、子プロセスが終了したとします。そのとき、子プロセスは親プロセスに終了
|
3
|
+
プログラムの中にはプログラムの内部でプログラムを実行する(Cであれば`system`関数等)場合があります。呼び出す側のプロセスを親プロセス、呼び出される側のプロセスを子プロセスと言います。あるプログラムAが実行され、そのプロセスが動作中に、別のプログラムBを内部で実行したとしましょう。その時、プロセスは親子関係にあり、親プロセスではプログラムAが、子プロセスではプログラムBが動作することになります。プログラムBのコードを全て実行し、子プロセスが終了したとします。そのとき、子プロセスは親プロセスに終了ステータスを渡します。プログラムAではその終了ステータスによって動作を分岐させることができます。
|
4
4
|
|
5
5
|
この終了ステータスは整数値(とり得る範囲は環境によって異なる)で、ほとんどの環境では0が成功終了(正常終了)です。Cでは、この終了ステータスを簡単に返せるようにと、`main`関数の戻り値によって、どんな終了ステータスで終了したかを選べるようにしています。Cの中でも、0が成功終了を意味しており、`return 0;`となっている場合は、そのプロセスは成功終了を意味する終了ステータスを渡すようになっています。
|
6
6
|
|
@@ -11,9 +11,9 @@
|
|
11
11
|
FAQ
|
12
12
|
|
13
13
|
1. 成功終了を表す終了ステータスが0以外の環境(存在するかは不明)で、`return 0;`とした場合は、異常終了になるのですか?
|
14
|
-
いいえ、0または`EXIT_SUCCESS`(成功終了を表すマクロ、0とは限りない)を`main`でreturn(またはexit関数に渡す)した場合、その処理系における成功終了を表す終了
|
14
|
+
いいえ、0または`EXIT_SUCCESS`(成功終了を表すマクロ、0とは限りない)を`main`でreturn(またはexit関数に渡す)した場合、その処理系における成功終了を表す終了ステータスになります。`main`の`return 0;`はどのような状況においても、成功終了を意味します。
|
15
15
|
2. 0以外は異常終了なのですか?
|
16
|
-
Cの仕様で定義されているのは`EXIT_FAILURE`の場合に失敗終了を意味するということだけです。それ以外は処理依存になります。ただし、ほとんどの処理系では、0-255の範囲ではそのまま終了
|
16
|
+
Cの仕様で定義されているのは`EXIT_FAILURE`の場合に失敗終了を意味するということだけです。それ以外は処理依存になります。ただし、ほとんどの処理系では、0-255の範囲ではそのまま終了ステータスになり、0以外は異常とみなされます。
|
17
17
|
3. `return 0;`を省略しましたが、正常終了しました。バグですか?
|
18
18
|
戻り値が`void`ではない関数の中で、唯一`main`関数のみ`return`を省略出来ます。省略された場合は、一番最後に`return 0;`が存在するとみなされます。
|
19
19
|
4. どういうときに使うのですか?
|
1
終了コードになっていたのを修正
answer
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
プログラムの中にはプログラムの内部でプログラムを実行する(Cであれば`system`関数等)場合があります。呼び出す側のプロセスを親プロセス、呼び出される側のプロセスを子プロセスと言います。あるプログラムAが実行され、そのプロセスが動作中に、別のプログラムBを内部で実行したとしましょう。その時、プロセスは親子関係にあり、親プロセスではプログラムAが、子プロセスではプログラムBが動作することになります。プログラムBのコードを全て実行し、子プロセスが終了したとします。そのとき、子プロセスは親プロセスに終了コードを渡します。プログラムAではその終了ステータスによって動作を分岐させることができます。
|
4
4
|
|
5
|
-
この終了
|
5
|
+
この終了ステータスは整数値(とり得る範囲は環境によって異なる)で、ほとんどの環境では0が成功終了(正常終了)です。Cでは、この終了ステータスを簡単に返せるようにと、`main`関数の戻り値によって、どんな終了ステータスで終了したかを選べるようにしています。Cの中でも、0が成功終了を意味しており、`return 0;`となっている場合は、そのプロセスは成功終了を意味する終了ステータスを渡すようになっています。
|
6
6
|
|
7
7
|
なお、`exit`関数で即座に完了することもでき、`exit`関数への引数も同じように解釈されます。(逆に言うと、`return 0;`は`exit(0);`と同じです。)
|
8
8
|
|
9
9
|
C++はCの拡張であるため、Cのこの仕様を引き継いでおり、同様の動作となります。
|
10
10
|
|
11
|
-
|
11
|
+
FAQ
|
12
12
|
|
13
13
|
1. 成功終了を表す終了ステータスが0以外の環境(存在するかは不明)で、`return 0;`とした場合は、異常終了になるのですか?
|
14
14
|
いいえ、0または`EXIT_SUCCESS`(成功終了を表すマクロ、0とは限りない)を`main`でreturn(またはexit関数に渡す)した場合、その処理系における成功終了を表す終了コードになります。`main`の`return 0;`はどのような状況においても、成功終了を意味します。
|