戻り値が欠落している関数: ランタイム動作の探索
void 以外の関数に return ステートメントがないため、動作に関する懸念が生じます実行時のプログラムの。 VisualStudio 2008 は、次のコードの戻り値が欠落していることを適切に警告します:
int doSomethingWith(int value) { int returnValue = 3; bool condition = false; if(condition) // returnValue += value; // DOH return returnValue; } int main(int argc, char* argv[]) { int foo = 10; int result = doSomethingWith(foo); return 0; }
警告にもかかわらず、プログラムはコンパイルされて実行されます。ただし、'doSomethingWith' 関数の戻り値は期待されるものではありません。
未定義の動作ですか?
ISO C 標準として (セクション 6.6. 3) ステートメント:
「関数の終わりからのフローは、値のない戻りと同等です。これにより、値を返す関数では未定義の動作が発生します。」
これは、プログラムの動作は予測不可能です。この特定のインスタンスでは、戻り値は 0 に設定されます。
結果の値はどのように計算されますか?
関数が明示的に値を返さない場合、コンパイラはコンテキストに基づいて戻り値の型を決定しようとします。この場合、関数は「int」を返すように宣言されているため、コンパイラは戻り値を 0 に初期化します。
非 POD データ型では何が起こりますか?
非 POD データ型の戻り値が欠落している関数の動作はさらに予測不可能です。明示的に初期化しないと、コンパイラはデフォルト値を想定できず、戻り値はガベージ データになる可能性があります。
結論
一方、提供された例のプログラムは何もしなくても実行できます。顕著な問題があるため、未定義の動作に依存することは決してお勧めできません。微妙でデバッグが難しい問題が発生する可能性があります。すべての非 void 関数には、適切な戻り値を設定する明示的な return ステートメントがあることを常に確認してください。
以上がC 関数に戻り値がない場合はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。