代码改变世界

深入C语言返回值

2015-11-18 14:58  dream_er  阅读(1722)  评论(0编辑  收藏  举报

深入C语言返回值

最近在写另一篇博客时,突然发现了一个问题,感到好奇怪,和学长讨论了好久,但是还是没什么结果,于是就请教了网上的大神,终于有所收获,具体问题如下:

当一个函数(非main函数)没有给其显式的return时,他的返回值是什么呢?
本来我的猜想是:如果没有显式的return时,如果当前函数最后一行是个有返回值的函数时,返回这个函数的返回值,如果是个没有返回值的函数或是个表达式,则返回0,但是下面的代码打破了我的猜想,请问为何?gcc的返回实现机制是什么?(这是在gcc下的结果,clang一直返回0
代码如下:
void fun()
{
        printf("hello world\n");
}
int func()
{
        printf("hello worldrgerrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\n");
        fun();
}
int main()
{
        printf("%d\n",func()); //结果为6
}

链接:http://ask.csdn.net/questions/219366

 

许多人认为函数的返回值是随机的,但是经过我的测试,不同的编译器有不同的结果。主要分为一下两类:

第一类:始终返回0类,这结论是由clang的结果得出的。

第二类:有规律的返回某些值,绝对不是随机的哟,出现这些结果的编译器有VCGCC

结果分析:对于此问题,clang会给予警告,而gccvc不会有警告,所以可以确定的是,clang其内部对于这一问题有对应的处理机制,就是始终返回0,而gccvc不会有任何特殊处理,只会像其他有return的函数一样,将eax寄存器中的东西直接返回,如果eax寄存器中的值没有被改变,则直接返回其的默认值,也就是返回0

如果还是不是很清楚,请猛戳:http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value-without-pr