関数が非 void 戻り値のガベージを返す場合のコンパイラの動作
C では、関数の値を明示的に返さない関数定義された戻り値の型は、未定義の動作を持つとみなされます。ただし、一部のコンパイラは、このような場合にエラーを発行せず、戻り値をガベージとして残します。
コンパイラの耐性の理由
この動作は、次のような事実に起因します。コンパイラにとって、関数が最後に到達してガベージを返すのか、それとも例外や別の非標準の戻り値によって終了するのかを明確に判断するのは困難な場合があります。
例
次のコードを考えてみましょう:
int func1() { return; // Error } int func2() { // Does not return anything }
最初の関数 func1() は、コンパイル中にエラーを発生させます。は、指定された戻り値の型 (int) の値を明示的に返しません。一方、func2() は明示的に値を返さないにもかかわらずエラーを生成しません。
変数の初期化の影響
func2() の未定義の動作は次のとおりです。 C の初期化されていない変数とは異なります。 C 標準では、明示的に初期化されていない変数と、不完全な実行またはその他の例外的な条件により「未定義の動作」として指定されている変数を区別します。
コンパイラ警告と標準定義
ほとんどのコンパイラーは func2() に対してエラーを発生させませんが、未定義の動作の可能性を示す警告を発行する場合があります。 C 標準では、void 以外の戻り値を指定せずに関数を終了すると、未定義の動作が発生すると規定されています。
関数の終わりから流れることは、値を持たない戻りと同等です。これにより、値を返す関数で未定義の動作が発生します。
結論
一部のコンパイラでは、値を返さない関数ではエラーが発生しませんが、この動作は考慮されています。 C 標準では定義されていません。コンパイラーはそのようなケースにフラグを立てる警告を提供する場合がありますが、すべての関数に明示的な return ステートメントがあることを確認したり、例外的な戻り条件を適切に処理したりするのは最終的には開発者の責任です。
以上がC 関数が値を返さない場合はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。