- ベストアンサー
main()とint main(void)の違い
最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように なりました。 どのように違うのでしょうか? main関数のところに引数が入っている意味がわかりません。 (void)ってなんですか? そもそも引数って何ですか? あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか? 回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
C言語の歴史的な流れとして、だんだんと厳格になっています。最初は無かった規則が、後の規格で追加されています。 互換性のために古い書き方もある程度できますが、新しい記述方法が推奨されます。 話がmain関数だとちょっとわかりずらいところもあるので、いったん、自分で関数fooを定義するときのことを考えます ○引数 引数は関数を呼び出すときに()の中に指定するもので、呼び出し側と関数とのデータのやりとりに使用します。 例えば、 atofなら atof(s1)として文字列s1を関数に渡します。aotf関数では、渡されたs1から数値に変換して戻り値として返します。 これを、atof(s2)とかatof("3.14")とか引数を変えることで、戻ってくる値も変わります。 ○ return 関数から戻り値として値を返すときにreturn を使います。 通常はretrun で値を返す必要があります。 戻り値が無いことを示す void型の関数の場合は逆にreturn X ;と値を返してはいけません。return;とだけ書きます。 ○ foo() これは、関数定義の際に ・戻り値の型が省略されたときはint型とみなす ・引数に何も記述が無いのは、「可変引数」だとみなす(要するに、いろんな型の引数を何個並べてもいい) というルールが適用されます。これは、古いCがそのように動作していたからです。 現在ではこのような省略は推奨されていません。現行のルールで省略無しに書くと int foo(...) となります。 ○ int foo(void) 可変引数だと、引数の型も数も任意になるので foo(a), foo(0.5,8), foo("BAR",3),foo(3,"BAR") いずれも「問題無い」としてコンパイルできてしまいます。普通に考えて、foo("BAR",3),foo(3,"BAR")が両方動作する状況は少なく、どちらかが間違いなはずです。 そこで、現在では、引数の型と数をちゃんと宣言するようにし、可変引数は、最小限の本当に必要なところだけにします。 何も引数が無い場合(foo()と使用する)、 foo()と宣言したら上の暗黙のルールが適用されてしまいます。そこで、「何も無い」ことを明示するために、 (void)と宣言します。 ○ int main(void) main関数も関数の一つなので、上のルールが適用されます。 ただ、特殊な扱いをされる関数なので、なんでもかんでも使えると、システムとして問題にあります。 そのため、戻り値と引数には一定の決まりがあります。 ・戻り値はint ・引数は (void)または(int, **char) ・それ以外は環境依存。組込み用等の特殊用途では、上のルールを使わないで、専用の型と引数になることもある。 ○main関数の引数 最初のころの演習問題だけだと、意識することは無いでしょうが 例えば、入力ファイル名を変えるとき、演習ではソースを変更→コンパイルとしていると思います。 しかし、実際の場面では、そんなことはしていません。 a.txtを表示するなら cat a.txt (WINDOWS なら type a.txt) b.txtを表示するなら cat b.txt (WINDOWS なら type b.txt) と、コンパイル無しでできます。 これらのa.txt,b.txtのような指定を「コマンドライン引数」あるいは、他と区別付くなら単に「引数」と呼びますが、これをプログラムから受け取るための仕組みがint main(int, char**)と宣言されたmain関数の引数になります。 詳しくは、参考書、入門サイト等を見てください。 ○main関数の戻り値 これも演習問題では意識することは無いでしょうが まず、int型として宣言した以上は、なにか値を返す必要があります。そのためにreturn 0;のように明示する必要がありす。 バッチファイルやシェルスクリプトを使っていると、コマンドが成功したかどうかで処理を分けたいことがあります。 このとき使用するのが、例えばWINDOWSだったらERRORLEVELなのですが、これに設定されるのが、main関数の戻り値です。 通常、正常終了では0,エラー等があった場合は0以外を返すようにします。 returnを省いても、main関数の最後まで来ればプログラムは終了しますが、そのときには何が返るかわかりません。0でないことが多いでしょう。となると、正常に終了したはずなのに「異常終了」とみなされてしまうことになります。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
int foo() の解釈は「宣言」と「定義」で違いますよね>#1. 宣言なら「引数はなんでもいい」ですが定義なら「引数なし」.