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