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になります。intvoid}main
(*)その戻りタイプが。と互換性がある場合int。
あなたはコメントで言います:
func()の場合、5の戻り値を取得しています
今回、実際にマシンで発生したように見えるのは、の戻り値printf(5、印刷された文字数)がfuncレジスターに戻ったことです。funcは、自身が戻る前にそのレジスタを変更していないため、同じレジスタをチェックしたときmainの戻り値のように見えるものを確認します。func
の分解された実行可能コードを調べることで、これを確認または反論することができますfunc。
これが実際に起こったことである場合、それは使用中の呼び出し規約の詳細であり、呼び出しfunc後にレジスタを使用しない出来事ですprintf。キリレンコが言うように、行動は正式には定義されておらず、あなたはそれに依存する権利がありません。