foo()
決して終了しない関数を考えてみましょう:
int foo(int n) {
if(n != 0) return n;
else for(;;); /* intentional infinite loop */
return 0; /* (*) */
}
最後の return-statement を省略することは有効な C ですか? その最後のステートメントを省略すると、未定義の動作が発生しますか?
foo()
決して終了しない関数を考えてみましょう:
int foo(int n) {
if(n != 0) return n;
else for(;;); /* intentional infinite loop */
return 0; /* (*) */
}
最後の return-statement を省略することは有効な C ですか? その最後のステートメントを省略すると、未定義の動作が発生しますか?
returnステートメントなしで返されたとしても、戻り値を使用しない限りUBはありません。
return
不定ループの後の最後のステートメントは省略できます。ただし、すべてのパスが返されるわけではないなどのコンパイル警告が表示される場合があります。関数内に無限ループがあるのは良くありません。ループを中断するための条件を 1 つ保持します。
その場合にその不定ループが本当に必要な場合、とにかくreturn
その後のステートメントはデッドコードです。それを削除しても、不明確な動作にはなりません。
非void
関数の場合、return
ステートメントがまったくないか、すべてのパスにreturn
ステートメントがあるわけではないことが有効です。
例えば:
// This is a valid function definition.
int foo(void)
{
}
また
// This is a valid function definition.
int bar(void)
{
if (printf(""))
{
exit(1);
}
return 0;
}
ただし、の戻り値の読み取りfoo
は未定義の動作です。
foo(); // OK
int a = foo(); // Undefined behavior
int b = bar(); // OK