元ネタ

プログラミング初心者スレ・Part1
http://yutori.2ch.net/test/read.cgi/news4vip/1195645613/

2 :以下、名無しにかわりましてVIPがお送りします。:2007/11/21(水) 20:50:08.21 ID:cmLDyUZr0
    基本形
    
    #include<stdio.h>
    
    void main()
    {
    
    return 0;
    
    }

せっかくだから何が悪いのかもちゃんと書きなさいよ><

C言語

という訳で、元ネタで示された基本形の悪いと考えられるところを突っ込む。
ちなみに、元ネタは以下のもの。

#include<stdio.h>

void main()
{

return 0;

}

一見どこにでもあるようなスタイルに見えるが、いくつかの真似するべきでない過ちを含んでいる。すなわち

  • main関数の戻り値がvoid型になっている
  • returnが値を返している
  • 使ってもいないライブラリを読み込んでいる。

というものだ。

最初の、main関数の戻り値がvoid型になっているのは、非常によくみるコードだ。
けれども、ANSIではint型で定義するよう定められている。
標準に従うべきか?という議論はあるだろうけれども、俺様オンリーソースでない限り、標準に従っておくのが無難だ。
スレでは標準にこだわる標準厨が沸くことがあるが、 厳密に標準に準拠する必要はないと筆者は考えているので、 「可能な限り」標準に従えるよう、努力すれば十分だろう。
それを差し引いても、voidなmain関数はよくない書き方だといえる。
ちなみに、大学の講義で使われる教科書や、古いタイプの教授はmainをvoidで書きたがる傾向にあるので、注意が必要だ。
さらにいえば、voidすら書かない古いタイプのものある"rogue"などがそうだ。

次のreturnが値を返しているという点だが、 これは「mainの戻り値がvoid型なのに、値を返すのはおかしい」という意味である。
もしint型なら、値を返すのもおかしくはない。
voidなのにreturnで返された値は、処理系によっては無視されるだろうが、 厳密には正しくないので、returnだけにしておくか、そのまま`}`に落としてしまって、 voidであることを読み手に理解させたほうが良いだろう。

さらに、C言語において引数の定義を書かなかった場合は、「引数が0個」ではなく「引数の数や型が不定」という意味になってしまうため、引数の定義も書いておくべきである。
ANSI Cではmainの引数は以下のいずれかである必要がある。

int main( void )
int main( int argc, char *argv[] )

1番目の形式はコマンドライン引数を使わない場合。
2番目の形式は、1番目がコマンドライン引数の数、2番目が個々のコマンドライン引数の文字列を格納した配列である。
(非標準ではこれ以外の形式を使えるものも存在する。例としてVisual Studioでは、さらに3番目の引数として環境変数を受け付けられるようにしている。)

これらを踏まえて書くと、先の基本形は

#include<stdio.h>

int main(void)
{

return 0;

}

となる。

今回はmainの戻り値をint型に直したので、returnが値を返していてもおかしくなくなった。
きちんとした土台の上に家を建てることが、丈夫な家への近道なのである。

さらに言えば、1行目の

#include<stdio.h>

これも不要といえる。いわゆる"おまじない"とされるものであるが、 実際これは、画面に文字を表示する等(printf)の便利なライブラリを読み込んでいるに過ぎない。 だが、じっさいのプログラムは何もしていないのでこのライブラリ"stdio.h"はまったく利用されていない ことになる。
最終的には以下のように添削されよう。
ちなみに、戻り値の意味は 0 = 正常終了 1 = 不正終了。

int main(void)
{

return 0;

}