2

foo()決して終了しない関数を考えてみましょう:

int foo(int n) {
    if(n != 0) return n;
    else for(;;); /* intentional infinite loop */

    return 0; /* (*) */
}

最後の return-statement を省略することは有効な C ですか? その最後のステートメントを省略すると、未定義の動作が発生しますか?

4

3 に答える 3

3

returnステートメントなしで返されたとしても、戻り値を使用しない限りUBはありません。

于 2013-02-01T18:02:07.590 に答える
3

return不定ループの後の最後のステートメントは省略できます。ただし、すべてのパスが返されるわけではないなどのコンパイル警告が表示される場合があります。関数内に無限ループがあるのは良くありません。ループを中断するための条件を 1 つ保持します。

その場合にその不定ループが本当に必要な場合、とにかくreturnその後のステートメントはデッドコードです。それを削除しても、不明確な動作にはなりません。

于 2013-02-01T17:53:49.447 に答える
1

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
于 2013-02-01T18:52:44.853 に答える