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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

8回答

8524閲覧

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

encho

総合スコア182

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3グッド

7クリップ

投稿2020/06/20 02:19

編集2020/06/20 12:53

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

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

こんな感じです

C++

1#include<iostream> 2using namespace std; 3 4int main() 5{ 6... 7 8return 0; 9}

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

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

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

ozwk, GenbuHase, yohhoy👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/06/20 02:31 編集

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

回答8

0

ベストアンサー

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関数の戻り値で終了ステータスを表すというのは有用だったのかも知れません。しかし、現代は、プログラムは複雑高機能化する傾向にあり、時代にそぐわなくなったのだとも思われます。

投稿2020/06/20 04:57

編集2020/06/20 05:05
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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では想定していません。

投稿2020/06/20 03:40

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2020/06/20 03:33

編集2020/06/20 04:16
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/06/20 04:01 編集

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

2020/06/20 03:46

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

2020/06/20 03:56

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

0

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

投稿2020/06/20 03:09

編集2020/06/20 03:10
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

return 0; で、呼び出し側に 0が通知されます。
通常、0 はエラー無しを意味します。

今、あまり使われる事は無い(?)ですが、 Windowsでは、Batファイルでその戻り値を見て処理の分岐を行う事ができます。(Unix系もそうだけど、忘れた)

投稿2020/06/20 02:32

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

encho

2020/06/20 03:04

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

2020/06/20 03:11

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

2020/06/20 03:13

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

0

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

投稿2020/06/20 08:20

編集2020/06/20 08:24
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/20 14:22

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/06/20 16:57

C言語もC99以降ならmain関数のreturn文を省略できますね。
Daregada

2020/06/20 18:01

「そもそもint main()じゃなくてvoidでいいのでは」という質問には、あまり関係がないがないからじゃないですかね > 誰も書いていない理由。
pepperleaf

2020/06/21 00:35

初期のC言語は、voidなんて無くて、intがディフォルト。で、省略も問題無かったですね。(要するにいい加減) いつの間にやら、厳しくなって、昔のコードが通らなくなった。
yumetodo

2020/06/21 06:22

型省略したときに暗黙にintになる仕様でしたもんね
Daregada

2020/06/22 05:01

関数のプロトタイプ宣言が導入されたときは、「なんでわざわざそんなことを、面倒すぎる」とか思ってました。すいません便利に使ってます。
pepperleaf

2020/06/22 05:12

> 関数のプロトタイプ宣言が導入 え、これも昔からでは? これも宣言無しだと、intと見なされるので、floatの時とか、色々と問題を起こしたような。voidの導入もvoidを明示的に宣言しないと、問題を起こす事があったため。(と言うより、バグ回避用?)
Daregada

2020/06/22 05:15

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

2020/06/22 05:21

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

2020/06/22 09:27

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

0

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

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

投稿2020/06/20 03:33

thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問