递归阶乘函数仅基例含return却输出正确结果的原因探究
为什么无return的递归阶乘函数碰巧返回了正确结果?
首先明确:你的代码行为属于C标准定义的未定义行为,能得到正确结果纯粹是巧合,依赖于当前编译器和运行环境的实现细节,绝对不能依赖这种写法。
问题根源分析
C标准规定:非void类型的函数如果执行到函数末尾却没有return语句(main函数除外),程序的行为是未定义的——编译器可以自由处理,可能返回垃圾值、复用之前寄存器里的值,甚至直接引发程序崩溃。
你的代码能得到正确结果,是因为多数系统的函数调用约定会用特定寄存器(比如x86架构的EAX)存储函数返回值,而你的代码执行过程中,这个寄存器恰好被填充了正确的阶乘结果:
- 递归到
factorial(1)时,执行return 1,此时1被写入返回值寄存器; - 回到
factorial(2)的上下文,计算k = 2 * 1,乘法指令的结果通常会写入同一个返回值寄存器(EAX),此时寄存器值更新为2; - 函数
factorial(2)没有return语句,直接结束,但编译器默认返回了当前返回值寄存器里的2; - 以此类推,
factorial(3)计算3*2=6,寄存器更新为6并返回;factorial(4)得到24,factorial(5)得到120,最终这个值被printf读取到。
你之前理解的执行流程有误,实际不会走到x=0的情况:当x=1时直接触发return 1,递归就开始逐层回溯计算,不会继续调用factorial(0)。
正确的阶乘递归写法
你的代码里全局变量k完全多余,而且必须给非void函数添加return语句,正确写法如下:
#include <stdio.h> int factorial(int x) { if (x == 1) { return 1; } // 直接返回计算结果,无需全局变量 return x * factorial(x - 1); } int main() { printf("Factorial of %d is: %d\n", 5, factorial(5)); return 0; }
这种写法符合C标准,在任何环境下都能得到正确结果,也彻底避免了未定义行为。
内容的提问来源于stack exchange,提问作者user15183312
相关产品推荐
相关产品推荐

