如果函数永远不会返回,则省略return语句是有效的

时间:2013-02-01 17:51:05

标签: c undefined-behavior

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

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

    return 0; /* (*) */
}

有效的C是否省略了最终的return语句?如果我遗漏最后的陈述,它会引起不确定的行为吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

即使它没有返回语句也会返回,除非你使用返回值,否则没有UB。

答案 2 :(得分: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