質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

C++ なぜ int main()と書くのか?

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 6
  • VIEW 3,067

encho

score 82

C++ なぜ int main()と書くのか?

C++の勉強を最近始めました。
ふと思ったのですが書籍等では、main関数の宣言時に戻り値の指定を基本的にintと書いてあります。

こんな感じです

#include<iostream>
using namespace std;

int main()
{
...

return 0;
}

これを書いていて思ったのですが、戻り値にintを指定して、
return 0;を返すことに意味はあるのでしょうか?

初学者の私はJavaみたいにvoidで戻り値を指定しておけば良くない??
と思ってしまったのですが、
このことについて何かしらのアドバイスをいただけたらと思います。

初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2020/06/20 11:30 編集

    「C main 返り値」でググるとたくさん出てきます
    当然ご自身で調べたと思うので、効果的なアドバイスのために調べた内容を踏まえて何がわからないのかを教えて下さい

    キャンセル

回答 8

checkベストアンサー

+15

main関数からの戻り値はプロセスの終了ステータスになります。

プログラムの中にはプログラムの内部でプログラムを実行する(Cであればsystem関数等)場合があります。呼び出す側のプロセスを親プロセス、呼び出される側のプロセスを子プロセスと言います。あるプログラムAが実行され、そのプロセスが動作中に、別のプログラムBを内部で実行したとしましょう。その時、プロセスは親子関係にあり、親プロセスではプログラムAが、子プロセスではプログラムBが動作することになります。プログラムBのコードを全て実行し、子プロセスが終了したとします。そのとき、子プロセスは親プロセスに終了ステータスを渡します。プログラムAではその終了ステータスによって動作を分岐させることができます。

この終了ステータスは整数値(とり得る範囲は環境によって異なる)で、ほとんどの環境では0が成功終了(正常終了)です。Cでは、この終了ステータスを簡単に返せるようにと、main関数の戻り値によって、どんな終了ステータスで終了したかを選べるようにしています。Cの中でも、0が成功終了を意味しており、return 0;となっている場合は、そのプロセスは成功終了を意味する終了ステータスを渡すようになっています。

なお、exit関数で即座に完了することもでき、exit関数への引数も同じように解釈されます。(逆に言うと、return 0;exit(0);と同じです。)

C++はCの拡張であるため、Cのこの仕様を引き継いでおり、同様の動作となります。

FAQ

  1. 成功終了を表す終了ステータスが0以外の環境(存在するかは不明)で、return 0;とした場合は、異常終了になるのですか?
    いいえ、0またはEXIT_SUCCESS(成功終了を表すマクロ、0とは限りない)をmainでreturn(またはexit関数に渡す)した場合、その処理系における成功終了を表す終了ステータスになります。mainreturn 0;はどのような状況においても、成功終了を意味します。
  2. 0以外は異常終了なのですか?
    Cの仕様で定義されているのはEXIT_FAILUREの場合に失敗終了を意味するということだけです。それ以外は処理依存になります。ただし、ほとんどの処理系では、0-255の範囲ではそのまま終了ステータスになり、0以外は異常とみなされます。
  3. return 0;を省略しましたが、正常終了しました。バグですか?
    戻り値がvoidではない関数の中で、唯一main関数のみreturnを省略出来ます。省略された場合は、一番最後にreturn 0;が存在するとみなされます。
  4. どういうときに使うのですか?
    特にシェルで多用します。prog_1 && prog_2と書くと、prog_1が成功終了したばあいのみ、prog_2が実行されるということができます。その他、Bash等では$?で直前に実行したコマンドの終了ステータスを取得することができます。
    Windowsのバッチでは%ERRORLEVEL%IF ERRORLEVEL 1 goto errorといった使い方ができます。
  5. パイプとは関係ありますか?
    パイプは標準入出力を使った機能で、より多くの情報をプロセス間でやり取りできます。プロセス間の情報のやり取りと言えば同じですが、終了ステータスは子から親への整数値のみと言うかなり限られた物で、使い道も異なります。
  6. なぜ、Javaのmainでは戻り値がないんですか?
    Javaを含めた現代的言語のほとんどはexit関数に相当する物で終了ステータス指定するようにしています。そもそも、失敗終了などの異常終了は、プログラムがそれ以上実行出来ない異常事態に陥った場合です。それが発覚するのはmain関数の中というのはかなり希であり、その場でexit関数を呼び出すでしょう。つまり、main関数にそのような機能を付けたとしてもreturn 0;以外を使うことはほとんどないから、付けなかったと思われます。極少ない例をとっても、main関数内でexit関数を呼び出してはいけないわけではありませんので、無くても誰も困らないと判断されたのでしょう。
    Cが作られた当初のUNIXは、小さいプログラムをたくさん用意して、それを組み合わせて使うことが多かったというのもあると思います。小さいプログラムにおいて、main関数の戻り値で終了ステータスを表すというのは有用だったのかも知れません。しかし、現代は、プログラムは複雑高機能化する傾向にあり、時代にそぐわなくなったのだとも思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

もともと、CはUNIXを記述するために作られた言語です。で、UNIXにはパイプと言う機能があって、小さなプログラムを複数繋いで1つの処理をする様に出来ます。また、コマンドを&&で繋ぐ、あるいはシェルで結果を判定してプログラムが処理を全うできなかった(エラー)場合、後続のプログラムを実行しないように、終了ステータス(mainの返す値)を判定して実行の有無をきりわける必要が有ります。
以下参照
C言語のreturn 0の有用性が今更わかった話

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/20 12:38 編集

    小さなプログラム・・・等については『UNIXという考え方』という本に詳しいです。
    https://qiita.com/ohkawa/items/2e204b7a9e8139741a01

    キャンセル

  • 2020/06/20 12:46

    > UNIXにはパイプと言う機能が
    パイプは、前段の標準出力を後段の標準入力にする機能です。ここでの終了コードとは別モノです。

    キャンセル

  • 2020/06/20 12:56

    失礼、終了コードの判断と違いました。

    キャンセル

+4

Cのプログラムが稼働する環境としては、
・汎用OSの元で動くホスト環境
・組み込みなどのフリースタンディング環境
の2つが想定されています。int main()というのはホスト環境の場合です。

この場合は、「何らかのOSから呼び出されるプログラム」なので、一般的なOSの仕様に合わせて返り値がintになってます。OSはプログラムの実行が終わったら返り値を確認して、その結果で次の処理を変えることがあります。
実際に使える数値の範囲はOSに依存しますので、return 1000;が期待通り動くかはOSによります。

例えば、Unix/Linuxだと可能な返り値は0255で、それ以外の数値だと数値表現の下位1バイトを符号無し2進数とみなした値になります。
(また、例外で終了した場合は129以上になるのでそれと区別するためには128以下にしておく必要があります)
Windowsだと4バイト数値まで返せるようです(詳細未確認)。

可能性としては、OSがプログラムから完了コードとして受け取る値が整数値じゃなく文字列値であるようなOSも作れるでしょうが、そういうOSはCでは想定していません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

return 0; で、呼び出し側に 0が通知されます。
通常、0 はエラー無しを意味します。
今、あまり使われる事は無い(?)ですが、 Windowsでは、Batファイルでその戻り値を見て処理の分岐を行う事ができます。(Unix系もそうだけど、忘れた)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/20 12:04

    エラーなしかどうかはプログラムを動かしてみるまでわからないと思ったのですが、
    エラーがあった場合は異なる戻り値が返されるということですか?

    キャンセル

  • 2020/06/20 12:11

    (必要ならば)エラーがあった場合は異なる戻り値を返すように(あなたが)実装するという話ですよ.

    キャンセル

  • 2020/06/20 12:13

    違います。
    ここでのエラーと言うのは、プログラムの作成間違いでは無く、実行結果です。多くは、実行結果を画面に表示するなどしますが、実行結果をプログラムの終了コードとして利用するという事です。従って、そのプログラムを単独で実行する場合には、意味を持ちません。
    A と言うプログラムを実行し、その結果が、0だったら、 B というプログラムを実行する、、というように使います。

    キャンセル

+3

なぜCやC++のmainがintを返すのか、を考えるよりも、なぜJavaはmainをvoidにしたのか、を考えるほうがいいかと思います。
結局のところ、Cが最初に言語設計された時代の計算機環境では、mainが(プログラム全体の実行結果として)intの値を返すことが合理的であり、C++は「better C」として書けるという理由からそれを受け継ぎ、後から設計されたJavaは別の理由でvoidを採用したという順番なので。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

javaは開発者が意図する場所で exit codeを返す必要はないのは
jvmでシステム差異を吸収するためで、コマンド側で結果(例外、エラー、system.exit)によりjavaコマンドのint mainで処理しているため

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Javaはよく知りませんが、(きっとあるだろうと探してみると)System.exit()とかいうメソッドがあって、それがCにおけるmain関数でのreturn引数と同じ効果を持つようですね。

そういうメソッド/関数がわざわざ設けられているということなので「意味はある」ということが想像できるでしょう。バッチファイルやシェルスクリプトを組むとかしないとその恩恵には預かれないので「無意味」と思ってしまうこともあるかも知れませんが、あなたの知らないセカイもあるんだ、ということで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんなに回答がついているのに誰も書いていないので補足すると、C++ではmain関数のreturn文を省略できます。

basic.start.main/5
A return statement ([stmt.return]) in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std​::​exit with the return value as the argument.
If control flows off the end of the compound-statement of main, the effect is equivalent to a return with operand 0 (see also [except.handle]).

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/22 14:15

    あ、「引数を指定する(チェックできる)プロトタイプ宣言」のことです。

    キャンセル

  • 2020/06/22 14:21

    そろそろ、初期がいつかが問題となりそうでした。本当の初期は、引数の型宣言は、引数を示すカッコの外。その後、カッコに入って、型どころか数があってなくてもコンパイルOKがあって、、、と続くのでした。

    キャンセル

  • 2020/06/22 18:27

    数があってなくてもいいというのは互換性の観点で今もそうなはず(仮引数リストが空白だと何個でも渡せる

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る