You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C语言中递归函数非终止分支不写return也能得到正确返回值?

非全路径返回的递归函数得到预期结果的原因

这种情况本质是C语言的未定义行为(Undefined Behavior, UB),能得到正确结果只是当前运行环境、编译器参数共同作用的巧合,不具备可移植性,也不能作为通用写法依赖。

具体原因说明

  • C语言标准本身没有强制要求函数必须在所有执行路径都添加return语句,这种写法只会在开启编译告警(比如GCC/Clang加-Wall参数)时提示告警,不会禁止编译运行。
  • 绝大多数主流架构(x86、ARM等)的函数调用约定里,整型返回值会固定存放在特定寄存器中(比如x86架构的eax寄存器、ARM架构的r0寄存器)。你的代码递归到终止分支c == 10时,会把10写入对应的返回寄存器,而后续上层递归回溯时,既没有return语句覆盖这个寄存器的值,也没有其他操作修改该寄存器,所以最终main函数读到的就是寄存器里留存的10,刚好符合预期结果。

注意事项

千万不要依赖这种巧合实现逻辑,未定义行为的表现是完全不可控的:

  • 切换编译架构、调整编译器优化等级(比如开-O2优化)、修改函数内部逻辑都可能导致最终返回值变成随机值,甚至触发程序崩溃。
  • 正确的写法是给递归调用分支补充return,改为return while_recursion(c);,保证所有执行路径都有明确的返回值。

内容的提问来源于stack exchange,提问作者user15861750

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:54:03