returnステートメントが存在しない場合のint型returnステートメントの戻り値は何ですか
なんで?
int func()
{
printf("Hello");
}
int func1()
{
}
void main()
{
int s,p;
s=func();
p=func1();
printf("%d %d", s, p);
}
Cでは(これが質問のタグ付け方法です)、との両方の戻り値func
はfunc1
未定義です。
C11(n1570)、§6.9.1関数の定義
関数
}
を終了するに到達し、関数呼び出しの値が呼び出し元によって使用される場合、動作は未定義です。
さらに、ホストされた環境では、returntypeは。ではなくmain
である必要があります。ちなみに、例外があります。C99とC11では、終了する(*)に達すると、環境に返される値は0になります。int
void
}
main
(*)その戻りタイプが。と互換性がある場合int
。
あなたはコメントで言います:
func()の場合、5の戻り値を取得しています
今回、実際にマシンで発生したように見えるのは、の戻り値printf
(5、印刷された文字数)がfunc
レジスターに戻ったことです。func
は、自身が戻る前にそのレジスタを変更していないため、同じレジスタをチェックしたときmain
の戻り値のように見えるものを確認します。func
の分解された実行可能コードを調べることで、これを確認または反論することができますfunc
。
これが実際に起こったことである場合、それは使用中の呼び出し規約の詳細であり、呼び出しfunc
後にレジスタを使用しない出来事ですprintf
。キリレンコが言うように、行動は正式には定義されておらず、あなたはそれに依存する権利がありません。