【问题标题】:Return value of function when return path not specified [duplicate]未指定返回路径时函数的返回值[重复]
【发布时间】:2021-01-08 07:37:03
【问题描述】:
int foo(int i)
{
    if(i != 0)
        foo(i - 1);
    else
        return i;
}

GCC 警告control reaches end of non-void function [-Wreturn-type]

自从上一个将eax 设置为0 的return 语句以来,从任何其他路径返回时,它都会返回0。此外,无论我编写return foo(i - 1),编译器资源管理器都会生成完全相同的代码。可以将其视为有保证的行为吗?

【问题讨论】:

  • 你的递归构造必须有一个base case!这将有编译器正在寻找的“回退”返回语句(由于前瞻性是有限的,编译器无法确定控制何时到达代码的返回语句)。
  • 如果有多个返回路径并且其中一个返回修改了 eax,这可能不成立,这就是我的想法。在这种情况下,是的,你是对的。
  • 不,您不能将其视为有保证的行为,原因很简单,C++ 标准说它是未定义的行为。您正在查看编译器的行为,而不是 C++ 标准。
  • 查看我提出的副本的第二个最受好评的答案。
  • 请同时阅读这个链接的问题。

标签: c++ c function


【解决方案1】:

可以将其视为有保证的行为吗?

简单的回答:不。您必须拥有return

此外,编译器资源管理器生成完全相同的代码...

在 C 和 C++ 中,您不能依靠编译器输出来判断您是否正确地做某事。任何时候你调用未定义的行为,编译器都可能做任何事情。它甚至可能做你“期望”它做的事情。如果您从中推断出您的代码很好,您将被误导。正确的行为并不一定意味着正确的代码。

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多