• ベストアンサー

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はすべきではないとなんかの本で読んだのですが・・。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。 int main(int argc, char *argv[]) int main(void) 但し、最新のC言語規格(通称C99)では、 <ISO/IEC9899:1999> or in some other implementation-defined manner. </ISO/IEC9899:1999> となっているので、処理系が戻り値のvoidを認めていればvoidも可。 # 組込み系などで戻り値を使わない環境もあるためでしょうか。 なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、 voidは言語仕様的には正しくない。(でも動くものもある)

amazontester
質問者

お礼

なるほど。皆さんありがとうございます! とても勉強になりました。

その他の回答 (6)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

基本的には#5の回答の通りです。ただし、それはフルスペックの仕様を持つOS上で動作することを前提とした「ホスト環境」の場合の話です。 組み込み用途で使用する処理系は(LinuxやWindowsなどを除けば)、OSに依存しない「フリースタンディング環境」になります。フリースタンディング環境では、プログラムの開始時に呼ばれる関数の型と名前は処理系定義です(つまり、void main()でもOK)。 ちなみに、OSであってもμITRONのような環境は、一般にはホスト環境ではなく、フリースタンディング環境に分類されます。 なお、C++では、ホスト環境(hosted environment)とフリースタンディング環境(freestanding environment)ではなく、依存処理系(hosted implementation)と自立処理系(freestanding implementation)という表現を用いているようです。

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.6

C言語的にどれが正しいということはありません。 そのプログラムが動く環境に依存します。 引数を使わないとして、DOS/Windows/Unix/Linuxの場合は、 int main(void) もしくは main(void) /* intがデフォルトなので */ が正しく、void main()、void main(void) は間違い。厳密にはコンパイラ依存ですが、void main(void) と書くのが正しいメジャーなコンパイラは無いです。 家電機器等の組み込みのプログラムなら、場合によっては void main(void) と書くように指示されているかもしれません。 なお、ANSI-C 準拠のCで無ければ 引数部の void を書かなくてもいいです。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

CおよびC++の言語仕様(ISO/IEC9899とISO/IEC14882)自体には、envpというものはありません。 # 前述の2例とその"同等指定"(argv が char** argvとか)以外は載ってません。 envpは、C言語仕様から見ると、処理系の独自定義に過ぎません。 勿論、処理系依存の話ではそれが正しい処理系もありますし、 実際にはサポートしてる処理系も多いですが、サポートしてないものも多々あります。 環境を特定せずC言語としてみた場合、仮にサポートしていなくても正しい処理系で、正しいコードです。 # envpを使うと、処理系依存になります。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

誤解を与えそうなので補足。 つまり、C99に準拠した処理系(例えばVCとかは違います)で、 コンパイラのマニュアルにvoid main でいいと書いてある場合以外は、void mainは不正。 もしvoidが必須なC99の処理系だったとしても、 少なくとも講義で説明も無く教えるのは不適切でしょう。先生がよくわかってない可能性が大。 main() : 戻り値省略は確かにintですが、これ自体が非推奨です。 void main() : 前述の理由で、おそらく不正です。 void main( void ) : 同様に、おそらく不正です。 int main() : C++ (ISO/IEC14882)では、規格書にも載っている正しい形式です。     ※Cと違い、C++ では引数の void を省略したと看做されます。 int main( void ) : C言語として(C++としても)正しい形式です。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

さらに正しくは、int main(int argc, char *argv[], char *envp[])になります。ただ、環境変数envpについては、一部の処理系(CP/Mやホスト系)ではサポートしていなかった事例もあります。 void main(void)は癖の悪いプログラミングですので、忘れてください。これで飛ぶOSは無いと思いますが、戻り値をスタックに積むようなOSだとまずいことになるかも。

  • fxdwg99
  • ベストアンサー率45% (43/94)
回答No.1

正しくは、int main(int argc, char *argv[])です。 main関数の戻り値をコマンドプロンプトやシェルスクリプトが 利用しますので、mainの戻り値voidはあり得ません。 main()と書いた場合、戻り値が省略されているので暗黙でintになります。

関連するQ&A

  • int main(void)

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

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

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

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

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

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

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

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

  • int型とchar型について

    C言語初心者です。 よろしくお願いします。 ◎1----------------------- #include<stdio.h> int main(void) { int ss[4]="789"; printf("%c\n",ss[0]); return 0; } --------------------------- ◎2----------------------- #include<stdio.h> int main(void) { int *p; p="789"; printf("%c\n",*p); return 0; } --------------------------- ◎1、◎2の2つのプログラムについて疑問があります。 ◎1の「int ss[4]="789";」と◎2の「int *p;」のintの部分は今まで、何の疑問も抱かず、「char」として入力していました。 そこでchar型は1バイトの整数、int型は4バイトの整数ということで容量が違うだけで、intとしても大丈夫だろうと思ったのですが、 ◎1では、「'initializing' : 'char [4]' から 'int [4]' に変換することはできません。」とエラーが出て、◎2では「'char [4]' から 'int *' に変換することはできません。」とエラーが出ます。 intは文字列は扱えないということなのでしょうか? 以上intだと実行できない理由がわかりません。 初歩的なことですいませんが、教えていただけると嬉しいです。

  • int とcharの使い方と違い

    教えてgooに投稿するのは初めてですがよろしくお願いします。 最近C言語を勉強し始めた初心者です。 ネットのサイトを見て独学でしています。 過去スレッドをさらっと見て聞きたいことが書いてなかったので投稿します。(同じスレッドがあったらすみませんOTL) #include<stdio.h> int main(void) { int str='a'; printf("str=%c\n",str); return0; } この上のプログラムでは str=a と出て、エラーが出ずにコンパイル出来ました。でも、 #include<stdio.h> int main(void) { int str[]="abc"; printf("str=%s\n",str); return0; } とするとエラーが出ます。 int とcharの使い方と違いについて詳しく教えてほしいです>< お願いします。

  • borlandについて

    こんばんは Borland C++ Compiler 5.5 を使っているのですが… _______________ |#include <stdio.h>      |←のようなプログラムをコンパイル |               | したら |int main(void) |1:インクルードファイル'stdio.h'を |{              | オープン出来ない | printf("Hello.\n");   |5:プロントタイプ宣言のない関数 | return 0;        | 'printf'の呼び出し(関数mein) |}              |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ と出てきますどうしたらよいでしょうか。

  • voidについて

    いつもお世話になってます。 最近プログラミングの授業に全然ついていけなくて、1から勉強しようと思ってます。 今回はvoidについて質問なのですが、たとえば下のようなプログラムがあるとします(あえてabcとcdfとxyzを使い分けています。) 数字を入力するとプロトタイプ宣言した関数で足して戻り値が答え(←日本語あってますか?)ってことですよね? 私はvoid関数についてあまり理解できていないので、void関数ではどのように数字が動いているかとどれを一致させなければいけないのかをabcdefxyzを使って詳しく解説していただきたいです。 あと関数の起動の仕方(←日本語あってますか?)も教えていただきたいです。      c=tasu(a,b); printf("%lg\n",c);という方法とか      tasu(a,b); ←これだけとか )   文章ぐだぐだで申し訳ないです。 どなたかおねがいいたします。   ) #include<stdio.h> void tasu(double x, double y, double z); int main(void){ double a,b,c;      printf("1つ目の数字を入力>"); scanf("%lg", &a); printf("2つ目の数字を入力>"); scanf("%lg", &b); c=tasu(a,b); printf("%lg\n",c); return 0; } void tasu(int x, int y, int z) { d = e + f; }

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

専門家に質問してみよう