声明为int返回类型却无返回值的C语言函数为何能正常运行?
为什么无返回语句的int函数会输出40?
先看你贴出的代码:
#include <stdio.h> int fn(int a, int b){ int temp = b; a = 2*temp; b = a; } int main() { int x,y,printval; scanf("%d%d",&x,&y); printval = fn(x,y); printf("%d", printval); return 0; }
首先必须明确:这是C语言中的未定义行为(Undefined Behavior)。根据C标准,声明为非void返回类型的函数,如果没有通过return语句返回值就结束执行,程序的行为完全不可预测——编译器可以生成任何代码,结果可能随编译器版本、优化级别、硬件架构的不同而天差地别。
那为什么你输入10、20时会刚好输出40?这是特定环境下的巧合:
在常见的x86/x86_64架构中,函数的返回值通常会通过eax寄存器传递给调用者。我们拆解fn函数的执行流程:
temp = b:把传入的20赋值给tempa = 2*temp:计算得到40并赋值给ab = a:把40赋值给b
最后执行的b = a是一个赋值表达式,而赋值表达式的结果就是右值(也就是40)。在很多编译器的默认编译模式下,这个表达式的结果会被留在eax寄存器里。当fn函数没有return就结束时,调用者main依然会从eax寄存器读取返回值,刚好这里存的就是40,所以输出了这个值。
但绝对不要依赖这个行为!比如开启编译器优化(如-O2)、换用ARM架构编译器,结果可能变成随机垃圾值,甚至程序直接崩溃。正确的做法是给fn函数加上明确的return语句,比如你想返回修改后的b,就在函数末尾加return b;。
内容的提问来源于stack exchange,提问作者kamalnath L P
相关产品推荐
相关产品推荐

