• ベストアンサー

int void (main)の意味・・・

a-saitohの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.6

さらに蛇足を。。 C言語に限らず、関数(手続き)を呼び出す側と呼ばれる側では戻り値の型が合致していなければなりません。(呼ぶ側が期待する戻り値の型と、呼ばれる側が実際に返す戻り値の型) そしてmainを呼び出す「スタートアップルーチン」は、Cコンパイラが用意するものだと思ってください。 int main(・・・)と適合するようなスタートアップルーチンを持つCコンパイラは、「規格の規定どおりCコンパイラ」です。 void main(・・・)と適合するようなスタートアップルーチンを持つCコンパイラは、「規格の規定から外れた独自拡張をしたCコンパイラ」です。 以上の議論は、Cコンパイラが規格準拠かどうかの議論だということに注意してください。 一方、コンパイラの利用者(一般プログラマ)がmain()まわりをどう書くのが正しいか、ですが、 学校でC言語を習うときにはたいていWindowsやUNIXのCコンパイラを使います。これらは、int main(int argc, char *argv[])と適合するようなスタートアップルーチンを持つわけです。なのでmainのほうも int main(int argc, char *argv[]) と書かなければなりません。ただ、渡された引数をmain側で無視しても特に問題ないので、 int main(void) もアリです。 ただ「私がこれから書くプログラムは値を返さないから・・」といってみても、スタートアップルーチンの側の記述は固定的なので、main側で勝手に void main(・・・・としてはいけません。 現状の多くのWindows用コンパイラは、void main(と書いてもエラーとはしないですし、それをコンパイルして出来たプログラムも特に問題なく動きます(戻り値としてゴミ値を返してしまっているのですが)。 特定のコンパイラ、特定の対象環境で動く特定のソフトウェア製品を作ろうとするプログラマは、int mainだろうが void mainだろうが、目的に合致したものを選択すればよろしい。それが適切に選択できるのがプログラマの技量のうちです。 しかし、C言語を教育する場合は、「C言語の規格に合致するCコンパイラならどんなOSのどんなコンパイラでもうまくいく筈の、一般的な/コンサバティブな書き方」を教えるべきです。 「とりあえず演習に使う環境で問題なさげに動けばそれでいいい」というのは教育者の態度としてはいかがなものかと。 そういう意味で、初心者にvoid main()を教える学校や、void mainと書いてあるC言語入門書は不勉強すぎ。私に言わせれば失格です。

関連するQ&A

  • 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 main(void)

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

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

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

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

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

  • int型 void型について

    C初心者です。 「int main(voido)」や「void main(void)」がよくわかりません。 int、void、(void)とは返り値を返す、返さないということが理解できません。小学生でもわかる説明をしていただけないでしょうか? よろしくお願いいたします。 

  • 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)   と、とりあえず最初にこれを書く、と覚えていて意味がわかりません。 小学生でも理解できるくらいに噛み砕いて説明をお願いします。

  • int main()の・・・

    初心者です。 ものすごく基本的な質問なんですが、 int main() のint型は、どういった意味なんでしょうか? char main() はだめなんでしょうか? それと ()内意味はなんでしょうか? よろしくお願いします。

  • void **(char や intのアドレス混在)について

    printf("%d",voidd[0]);にてほしい値が表示されません。 どうすればいいですか? よろしくお願いします。 #include<stdio.h> int main() { /* Calc.StringExpressionGet("1+((2+34)*2-111*77)*5-67*8/90"); Calc.StringExpressionResolve(); Calc.Print(); */ int num[3]; num[0]=111; num[1]=222; num[2]=333; char str[4]="ABC"; void **voidd; voidd=new void*[6]; voidd[0]=(void *)&num[0]; voidd[1]=(void *)&str[0]; voidd[2]=(void *)&num[1]; voidd[3]=(void *)&str[1]; voidd[4]=(void *)&num[2]; voidd[5]=(void *)&str[2]; printf("%d",voidd[0]); getchar(); return 0; }

  • 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の使い方と違いについて詳しく教えてほしいです>< お願いします。