鱼C论坛

 找回密码
 立即注册
查看: 1154|回复: 1

[已解决]去掉return还能得到正确答案???

[复制链接]
发表于 2023-4-25 13:30:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这两个代码一模一样 唯一不同在于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;
}
最佳答案
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语句来返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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语句来返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表