求和函数未添加return语句却正常运行,原因是什么?
无return语句的int函数为何能返回正确结果?
先看你给出的代码:
#include <stdio.h> int summation(int sum) { if (sum == 1) { return 1; } int s=0; s = sum + summation(sum - 1); } void main() { printf("%d", summation(5)); }
这本质是未定义行为下的巧合结果,不是合法的C语言逻辑,具体原因和编译器的调用约定有关:
- 主流x86架构的编译器(比如GCC、Clang)对返回int类型的函数,会约定用
eax寄存器传递返回值。 - 执行
s = sum + summation(sum - 1);时,递归调用summation(sum-1)的返回值已经存在eax里,和sum相加后的结果也会存在eax寄存器中。 - 虽然函数没写
return s;,但函数结束后,调用者依然会从约定的eax寄存器读取返回值,刚好这个值就是s的计算结果,所以碰巧输出了15。
但这种情况绝对不能依赖:
- 换个编译器、调整优化等级、改架构(比如ARM),或者修改函数内的代码逻辑,结果可能直接出错甚至程序崩溃。
- 根据C语言标准,返回非void类型的函数如果没有return语句,属于未定义行为,编译器可以做任何处理,没有任何可靠性保证。
内容的提问来源于stack exchange,提问作者Aryan Mane
相关产品推荐
相关产品推荐

