递归函数没有return语句 为什么会返回i?不应该返回随机数吗

如下图:
img
运行结果:6
这段代码的函数fc中,每个if、else if、else分支内都有 return i; 因此函数的返回值是i,我是可以理解的。结果是6,我也是理解的。

但下面这段代码(去掉了else if 和 else分支中的return i 语句), 为什么结果还是6而不是随机数呢?(书上说没return 函数的返回值会是随机数)
img

img

将代码奉上:

#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为止。