无return语句的element()函数为何能返回值?求逻辑解析
无return语句的函数为何能返回值?
给定以下C语言代码,输出为660 44 352 660,但element()函数明明没有写return语句,却能把k的值“返回”给调用者,这背后的运行逻辑是什么?
#include <stdio.h> int k = 9; int element(int a, int b) { k = k + (a * b); } int main() { int a = 12, b = 5, c = 7; a = element(c, b); b = element(a, c); c = element(a, c); printf("%d ", k); printf("%d ", a); printf("%d ", b); printf("%d ", c); }
运行逻辑解析
- 这本质是C语言的未定义行为,不是函数真的“返回”了
k。C标准明确规定:如果一个声明为有返回值类型(比如这里的int)的函数,执行结束时没有触发return语句,调用者去使用这个函数的返回值是完全没有保障的——结果可能随编译器、系统、编译选项甚至代码的微小改动而天差地别。 - 你看到的结果只是当前编译环境下的“巧合”:很多编译器(比如GCC)会默认把函数最后一条表达式的计算结果,或者某个特定寄存器里的值当作返回值。在这个例子里,
k = k + (a * b)这条赋值语句的结果就是k的新值,而你的编译器刚好把这个结果存在了用来传递返回值的寄存器(比如x86架构的EAX寄存器)里,所以调用者读取这个寄存器时,刚好拿到了k的当前值。 - 但这绝对不是规范写法!换个编译器或者调整代码,结果可能完全错误,甚至导致程序崩溃。正确的做法要么给
element函数加上明确的return k;语句,要么如果不需要返回值,就把函数声明为void类型。
内容的提问来源于stack exchange,提问作者Shiva Surya.S
相关产品推荐
相关产品推荐

