退货声明的输出

时间:2013-12-21 18:24:14

标签: c

在这里,无法理解回归的本质....

#include <stdio.h>
#include <stdlib.h>

int fun1(int i)
{
        return ;
}

int main()
{
        int i = 0;
        for (i = 0; i<5; i++)
        {
                printf("%d\n",fun1(i));
        }
        return 0;
}

输出: 0 1 2 3 4

有人可以解释???

1 个答案:

答案 0 :(得分:8)

您的程序有未定义的行为。它无法返回fun1的值。什么事情都可能发生。

它编译的事实意味着您的编译器遵循旧标准。例如C89说:

  

3.6.6.4退货声明

     

...

     

如果执行了没有表达式的return语句,并且调用者使用了函数调用的值,则行为未定义。

另一方面,C99说:

  

6.8.6.4退货声明

     

...

     

没有表达式的return语句只能出现在   返回类型为void的函数。

因此,如果您的编译器严格遵守C99或更高版本,那么您的代码无效。

关于程序行为的原因,这是一个毫无意义的推理,因为它的行为是未定义的。也许这个编译器的ABI恰好期望将返回值放在一个寄存器中,当调用i时,该寄存器还包含调用者的循环变量fun1的值。无论如何,你的程序可以输出任何东西。

由于fun1的返回类型不是void,因此您应该使用具有表达式的return语句的形式。例如:

int fun1(int i)
{
    return i;
}