2

考虑一个foo()可能永远不会退出的函数:

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

    return 0; /* (*) */
}

省略最终的返回语句是否有效?如果我省略最后的陈述,它会引起未定义的行为吗?

4

3 回答 3

3

您可以省略return无限循环之后的最后一条语句。但是您可能会收到编译警告,例如并非所有路径都返回。在函数中有无限循环是不好的。保持一个条件来打破循环。

如果在这种情况下确实需要无限循环,那么return之后的语句就是死代码。删除它不会是不确定的行为。

于 2013-02-01T17:53:49.447 回答
3

即使它在没有返回语句的情况下返回,也没有 UB,除非您使用返回值。

于 2013-02-01T18:02:07.590 回答
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 回答