马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
首先,我想澄清一下,你提到的两个代码片段中的第二个版本(没有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语句来返回值。
|