大学のオペレーティングシステム論という講義で、プロセスを複製したり消滅させたりする話を聞いていたときに、大学に入ってはじめてC言語を書いたときのことを思い出したので少しだけ書きます。
#include <stdio.h> int main (void) { printf("Hello, world.\n"); return 0; }
慣れればなんともない入門の挨拶プログラムです。
printf
ってよく使うのにわざわざ<stdio.h>をincludeしないといけないんだなとか思いながらも、なんとなく雰囲気をつかんで、類題を難問か書いているうちに、ふと疑問に思ったことがありました。
最後の部分について、「なんで 0 なんか返しているんだろう」「正常終了なのに0ってfalse
っぽいから1を返したい」「そもそもなんで整数返してるのだろう」「返り値voidにしてしまいたい」というふうに思い、実際に
void main (void) { printf("Hello, world.\n"); return; }
を書いてコンパイルしてみました。
すると、gccは
warning: return type of 'main' is not 'int'
と注意してきました。この演習のときには「こういうものなのか」という気持ちで、とりあえず済ませた気がします。
この疑問を持ってからどこかの本で
「主役っぽく見えるmain関数も実際は誰かに呼び出されている身で、呼び出し側は返り値として整数を期待している。その返り値は exit関数の引数になっている。」
ということを知りました。続いて exit を調べると、引数に0を受け取った場合は正常終了で、1などの0以外を受け取ると異常な終了となるということが分かりました。
そりゃあvoidにしたら注意されるよな、と納得しました。
プログラミングに限りませんが、このような小さな疑問を無視せずに調べてみることは案外楽しい作業だったりします。自分が疑問に思った順に勉強を進めると、テキストの章立てより理解しやすいことも多々あります。
趣味の勉強など時間に制限がない場合は特におすすめです。