如下图:
运行结果:6
这段代码的函数fc中,每个if、else if、else分支内都有 return i; 因此函数的返回值是i,我是可以理解的。结果是6,我也是理解的。
但下面这段代码(去掉了else if 和 else分支中的return i 语句), 为什么结果还是6而不是随机数呢?(书上说没return 函数的返回值会是随机数)
将代码奉上:
#include <stdio.h>
int i=1;
int fc(int n)
{
if(n==1)
return i;
else if(n%2==0)
{
fc(n/2);
i++;
// return i;
}
else
{
fc(3*n+1);
i++;
// return i;
}
}
void main()
{
int n,step;
n=5;
step=fc(n);
printf("%d",step);
}
C中如果没有返回值则默认返回寄存器eax的值,因为最后执行的是i++,此时eax内的值为i的最终值,所以成功返回了6
你可以看一下汇编层面的函数返回值是如何约定的,我查到的资料是默认返回某几个特定寄存器中的值
应该是在计算过程中恰好对i赋值时用到了对应寄存器,于是相应的值就存在里面,正好被外部读取到了
有帮助请采纳
个人理解:
汇编代码函数返回值放在%eax中,i++语句计算的结果值也放在这个寄存器中,在函数返回时取回了%eax的值,就相当于与返回了i。
您递归运行,永远是一个结果。
#include
#include
#include
using namespace std;
int main()
{
srand((int)time(0)); // 产生随机种子 把0换成NULL也行
for (int i = 0; i < 10; i++)
{
cout << rand()%100<< " ";
}
return 0;
}
13 8 99 28 43 84 34 24 72 19
11 90 27 79 94 4 9 42 84 26 两次产生的数据就不一样了
你可以按照逻辑去代入,或者调试看走向。会发现,其实就是在不断的调用fc函数,直到满足n==1,返回i为止。