【问题标题】:how return statement is handled in nested function calls? [duplicate]嵌套函数调用中如何处理 return 语句? [复制]
【发布时间】:2016-05-16 02:17:29
【问题描述】:

我很怀疑在使用一些递归函数进行编码时会遇到一些问题。现在在这里我给出一个带有嵌套函数调用的简单代码,以便我可以指出我的确切问题。

int main(void) 
{

    int i;
    i=a();
    printf("%d\n",i);
    return 0;
}
int a()
{
  return b();

}
int b()
{
    return 9;
}

好吧,完全没有问题,它的输出为9。但如果我将函数a() 重新定义为:

int a()
{
b();
int new=0; //not significant
}

它再次产生有效的输出,即,

9

在这里,虽然我删除了return 关键字,但我没有收到任何编译错误,输出中i 的值也没有错误......(我预计是垃圾或类似的东西)。 这些事情是如何处理的?

【问题讨论】:

  • 这不是一个重复的问题。我的问题与其他返回类型的查询和问题有些不同。
  • @RCoffee:抱歉,选择的副本准确地反映了您修改过的代码——它是一个很好的副本。行为未定义;任何结果都可以,除了耸耸肩说“哦,好吧”之外,没有其他方法可以解释你得到了什么结果。
  • 我接受你的回答@CodingBatman 因为你指出的内容非常合乎逻辑。但公平地说,我也尝试过 gcc(我使用 Fedora)和 dev c++。它们都显示了我从函数 b() 返回的输出。
  • @JonathanLeffler 我认为现在是时候耸耸肩说“哦,好吧”。 :) 实际上我正在尝试递归二进制搜索和 Towerofhanoi 算法。在编码中,我在递归调用之前错误地跳过了 return 关键字。但是我没有编译错误并且也得到了正确的输出。
  • @RCoffee,但您确实收到了编译器警告。请检查warning 的编译选项卡。您需要在编译期间使用-Wall 编译器标志。

标签: c function recursion return


【解决方案1】:

在您的第二段代码中:

int a()
{
    b();
    int new=0; //not significant
}

a() 的返回类型为int。但是,在您的代码中,您没有返回任何内容。这通常会导致undefined behavior。所以,你可能会得到任何值(你说你得到 9,而在 ideone 上使用 gcc,我是 getting 0)。这是未定义的行为,所以没有人能准确地说出你会得到什么。

这取决于编译器,正如SO Answer 中所指出的,但编译器没有义务记录发生的情况,也不需要在返回值中保持一致。不同的调用可能返回不同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2014-04-04
    • 2020-01-04
    相关资源
    最近更新 更多