【问题标题】:Function returning value with no specified return statement in the control flow structure控制流结构中没有指定返回语句的函数返回值
【发布时间】:2020-07-28 00:20:08
【问题描述】:

今天我正在试验随机的 C 代码,我发现了一些让我感到困惑的东西。在以下程序中:

#include <stdio.h>
int f(int x)
{
        if(x==2)
        return 2;
        else
        {
                printf("+");
                f(x-1);
        }
}
int main()
{
        int n,i;
        n = f(6);
        printf("%d\n",n);
}

输出很符合预期++++2,没有混淆'+'的数量,因为递归调用的数量是4。但是我的问题是关于返回值2。在函数中,返回了一个值当if(x==2) 条件成立时。现在,当使用 2 以外的数字调用函数时,它将进入 else 块。该块中没有明确的 return 语句。但它仍然在返回一个值。如何允许?即使没有明确要求程序返回一个数字,它又是如何决定返回的呢?程序是否只是简单地返回它从最近的函数调用中获得的数字?当一个函数被调用时,调用者维护一个栈。返回值存储在寄存器中。该函数是否应该返回存储在该寄存器中的值?有人请解释一下。

【问题讨论】:

  • 编译器应该警告你没有提供返回值。为您的编译器尝试-Wall 或类似名称。在这种情况下返回的值是未定义的,可能看起来是“随机的”。

标签: c recursion return


【解决方案1】:

如果到达终止函数的},并且在调用者中使用返回值,则程序的行为是undefined。您不能期望任何理由对 获得的价值作为回报。在另一次运行中,它可能会返回一个完全不同的整数值,返回您最喜欢的歌曲的完整歌词,或者让您的计算机着火。没有任何保证。

引用 C11,第 6.9.1 章

如果到达终止函数的},并且调用者使用了函数调用的值,则行为未定义。

【讨论】:

  • 我认为它正在返回从最近的函数调用中获得的值。因为当我创建像int foo() {return 20;} 这样的虚拟函数并在 f(x-1) 之后调用它时,它实际上返回 20。
  • @Ricky 正如我所说,您的情况可能是这样,但总的来说,根据 C 标准,此代码是无效的,
  • 是的...代码无效。这就是为什么结果让我感到惊讶!
  • @Ricky 结果未定义,但实际上结果通常是寄存器中的一些剩余值或先前操作的某个内存位置中的一些剩余值,因此得到 20 作为结果并不令人惊讶。
  • 已经在别处观察到,对于通过接近}而返回的函数,GCC 可能有意返回最后一个评估的表达式的值。
猜你喜欢
  • 2011-06-06
  • 2011-10-26
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多