a905448839 发表于 2023-4-25 13:30:39

去掉return还能得到正确答案???

这两个代码一模一样 唯一不同在于else语句里的return去掉了

但是结果一模一样

问题1:去掉之后的运行逻辑和程序运行的每一步的动作是否一样呢?
问题2:为什么有return的那个代码 第一次运行peach函数就会到return peach(day + 1, (num + 1) * 2);这里不会返回这个函数的值到main函数里吗?

#include <stdio.h>

// 定义一个函数 peach,用于计算猴子吃桃问题
int peach(int day, int num) {
    // 如果当前是第 10 天,表示只剩下一个桃子,直接返回 num
    if (day == 10) {
      return num;
    } else {
      // 否则,根据题目的规律,前一天剩余桃子数 = (当前桃子数 + 1)* 2
      // 调用 peach 函数自身来计算前一天剩余的桃子数,然后将其代入公式中得到当前的桃子数,最后返回计算结果
      return peach(day + 1, (num + 1) * 2);
    }
}

// 主函数
int main() {
    // 调用 peach 函数来计算第一天共摘了多少个桃子,并将结果打印输出
    printf("第一天共摘了 %d 个桃子\n", peach(1, 1));
    return 0;
}


#include <stdio.h>

// 定义一个函数 peach,用于计算猴子吃桃问题
int peach(int day, int num) {
    // 如果当前是第 10 天,表示只剩下一个桃子,直接返回 num
    if (day == 10) {
      return num;
    } else {
      // 否则,根据题目的规律,前一天剩余桃子数 = (当前桃子数 + 1)* 2
      // 调用 peach 函数自身来计算前一天剩余的桃子数,然后将其代入公式中得到当前的桃子数,最后返回计算结果
         peach(day + 1, (num + 1) * 2);
    }
}

// 主函数
int main() {
    // 调用 peach 函数来计算第一天共摘了多少个桃子,并将结果打印输出
    printf("第一天共摘了 %d 个桃子\n", peach(1, 1));
    return 0;
}

isdkz 发表于 2023-4-25 13:33:40

首先,我想澄清一下,你提到的两个代码片段中的第二个版本(没有return语句的版本)实际上是不正确的,它可能在某些编译器下偶然得到了正确的结果,但这不是一个可靠的行为。

问题1:去掉之后的运行逻辑和程序运行的每一步的动作是否一样呢?

答:不一样。去掉return后,你的peach函数不再返回任何值。在C语言中,不显式返回值的函数的行为是未定义的。这意味着编译器可能会产生不可预测的结果,这是因为没有显式地告诉它在函数返回时如何处理返回值。因此,去掉return后,程序运行的逻辑和每一步的动作是不一样的。

问题2:为什么有return的那个代码 第一次运行peach函数就会到return peach(day + 1, (num + 1) * 2); 这里不会返回这个函数的值到main函数里吗?

答:有return的代码在执行到return peach(day + 1, (num + 1) * 2)时,会递归地调用peach函数,一直到达基本情况(day == 10)。然后它开始返回值到上一层的调用,直到最后返回到main函数里。因此,有return的代码确实会将函数的值返回到main函数里。

在你的第二个代码片段中,由于没有显式返回值,编译器可能会偶然地使用寄存器中的值(这个值可能是由于之前的计算而存在的),从而导致在某些情况下得到正确的结果。然而,这并不是一个可靠的行为,你不能期望这个版本的代码在所有编译器和系统上都能正常工作。因此,建议始终在函数中显式地使用return语句来返回值。
页: [1]
查看完整版本: 去掉return还能得到正确答案???