作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

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;は記述した方がいいと思います。

更新情報