• ベストアンサー

main()とint main(void)の違い

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

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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)
回答No.2

int foo() の解釈は「宣言」と「定義」で違いますよね>#1. 宣言なら「引数はなんでもいい」ですが定義なら「引数なし」.

関連するQ&A

  • int main(void)

    C言語の問題集をやっているのですが、 本にはmain関数の最初にint main(void)のような書き方が してあります。 学校ではmain() と習ったのですが、本には上のようにかいてあります。 どのように違うのでしょうか? というかmain関数のところに引数が入っている意味がわかりません。 どういうことがというと(void)ってなんですか? またint mainというのはint型の関数だと思うのですが、 なかではdouble型とかも使えます。 お願いします。

  • int main()、void main()、void main(void)、int main(void)

    今日、大学でC言語の講義の時間、先生が、 #include <stdio.h> void main(void){ } と宣言してプログラムを書くと教えていました。 main関数には、 main() void main() void main( void ) int main() int main( void ) と、人によりいくつかの描き方があったりします。 どれが本当は正しいのでしょうか? void mainはすべきではないとなんかの本で読んだのですが・・。

  • int void (main)の意味・・・

    僕が今習っている学校では、『#include <stcio.h>』のあとに『void main()』と書きます。※『;』はつけません。 しかし、参考書などを見ると、『int main(void);』と書いてあります。これ(int main(void))はどういう意味なのかが知りたいのですが・・・。 あとできれば、『void main()』との違いも書いてくれれば幸いなのですが・・・。 回答お願いします。

  • int main(void) の意味について教えて下さい

     お早う御座います、Cの初心者です、宜しくお願いします。  最初にmain関数は、「int main(void)」という風に始まりますが 、main関数がstring型をとる場合とか、実際に他の関数から呼ばれる場合は有るのでしょうか。

  • int main(int argc, char* argv[]) についての質問

    こんにちは.つね日ごろ思っている質問させてください. Cの参考書には, (1) void main(void) { } (2) int main(int argc, char* argv[]) { return 0; } の2つのパターンが記載されていますが, どういう違いがあるのでしょうか? (1)の場合main関数は,型を持たず,引数も持たない. ※Turbo Cなどのコンパイラーでは, return文がないと警告出ます. (2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?) を指定している. といったくらいしか分かりません. (2)に関してもう少し述べれば, コマンドラインからファイルを指定し,実行することが できると勉強した記憶があるのですが, 理解があいまいです. 特に(2)の場合のmain関数の意味と,その使い方について アドバイスお願い致します.

  • void main (void)について、、、

    またまたすみません。 プログラムを書くときに、   void main (void)   と、とりあえず最初にこれを書く、と覚えていて意味がわかりません。 小学生でも理解できるくらいに噛み砕いて説明をお願いします。

  • 「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

    signal関数の書式についてですが、   void ( *signal(int sig, void (*func)(int)) ) (int); 最後に付く(int)は一体何でしょうか? このような関数の書式ははじめて見ました。 UNIX系の何かでしょうか。 回答よろしくお願いします。

  • main関数の事についてお聞きします。

    Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

  • 関数の引数をvoid*でキャストする

    最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。

専門家に質問してみよう