アプリ版:「スタンプのみでお礼する」機能のリリースについて

最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように
なりました。
どのように違うのでしょうか?
main関数のところに引数が入っている意味がわかりません。
(void)ってなんですか?
そもそも引数って何ですか?
あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか?
回答よろしくお願いします。

A 回答 (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でないことが多いでしょう。となると、正常に終了したはずなのに「異常終了」とみなされてしまうことになります。
    • good
    • 0

int foo() の解釈は「宣言」と「定義」で違いますよね>#1.


宣言なら「引数はなんでもいい」ですが定義なら「引数なし」.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!