main()は0を自動で返す
いきなり小ネタっぽいですが、C99では、main()
関数の最後に付けるreturn 0;
を省略できます。省略した場合は、main()
関数ブロックの結尾}
に達すると、実行環境に0
が返されます。
『Cクイックリファレンス』111頁
int main(void)
{
puts("hello, world");
}
$ ./a.out
hello, world
$ echo $?
0
ぼくの感覚だと間の抜けた印象で、return 0;
があった方が読みやすいです。『Cクイックリファレンス』に掲載されているサンプルコードでもreturn 0;
の有無が統一されておらず、記述されている方が圧倒的に多いです。中には、} // main()の終わり
とコメントされたものもあって(360頁)、作者も読みづらいと感じているかも知れません。
さて、前掲のコードを、C89(-std=c89
)でコンパイルして実行してみましょう。
$ gcc -std=c89 hello.c
./a.out
hello, world
$ echo $?
10
10
が返ってきました。この10
という値は偶然でしかなく、0
や他の値が返ってくる可能性もあります。main()
関数の戻り値の型をvoid
にしても、同じような結果になります。
ちなみに、GCC 11.2.0では、デフォルトで-std=gnu17
が指定されています(Language Standards Supported by GCC)。しかし、古いGCCだと-std=C99
の指定が必要かもしれません。そのような意味でも、return 0;
は記述した方がいいと思います。