退货声明的输出

Atu*_*uri -3 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:0 1 2 3 4

有人可以解释一下吗?

Dav*_*nan 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;
}
Run Code Online (Sandbox Code Playgroud)