2 に答える
それがまさにポイントです。
「void main()」はありません。常に結果値があり、結果値を返さず、プログラムで何もしない場合、戻り値は、プログラムの開始時に適切なレジスタにあるものです (具体的には、実行時にそこにあるものは何でも) main はスタートアップ コードから呼び出されます)。これは、共有ライブラリの処理など、メインの前にプログラムが何をしているかに依存する可能性があります。
編集:これがどのように起こるかを理解するには、これを試してください:
int foo(void)
{
return 55;
}
void main(void)
{
foo();
}
もちろん、保証はありませんが、このプログラムの終了コードが 55 になる可能性は十分にあります。これは、何らかの関数によって返される最後の値であるためです。その呼び出しがメインの前に発生したと想像してください。
クリスチャンが言っていることをさらに説明するために。void main()
プロセスが以前の値を返すと宣言したとしてもeax
(Linux x86 アーキテクチャを使用しているため)。
void main() {
asm("movl $55, %eax");
}
したがって、上記のコードが明示的に初期化すると、常に 55 b/c が返されますeax
。
$ cc rval.c
$ ./a.out
$ echo $?
55
繰り返しになりますが、この例は現在の主要な OS でのみ機能します。これは、呼び出し規約を想定しているためです。OS が別の呼び出し規則を持つことができず、戻り値が別の場所 (RAM、レジスタなど) になる可能性があるという理由はありません。