此代码的输出是什么?
#include<stdio.h>
//int a;
int main()
{
int a=2;
printf("%d",f1());
}
void f1()
{
int b;
++b;
}
我没有为f1()指定原型,即使它的打印 输出为0,有人可以解释一下吗? 即使函数的返回类型是,也会打印相同的输出 INT
答案 0 :(得分:2)
它被称为Implicit Function Declaration,它已经过时了。因为f1()
没有声明,所以编译器会隐式声明它。在隐式声明中,函数返回int
,这就是为什么它的行为却是如此,
f1()
未返回int
。答案 1 :(得分:1)
在1989 C标准(以及C的早期预标准版本)中,任何试图调用它的函数都隐式声明了一个函数。隐式声明是函数接受变量参数列表,并返回int
。
因此,由于您的printf()
语句在没有前面声明f1()
的情况下调用f1()
,编译器会假定它是一个返回int
的函数(并且可以接受任何数字)论点)。然后行为是未定义的,因为函数随后被定义为返回void
(即它与隐式声明不一致)。
在C99及更高版本中,这通常会导致编译错误。默认情况下,大多数C89编译器以静默方式接受隐式声明,但可以配置(更高的警告级别)以发出警告。某些供应商的某些编译器(特别是gcc)继续支持隐式声明,即使在编译后来的C标准时,仍默认配置为不发出警告。
注1:如果您的编译器接受f1()
的隐式声明,它可能也会在没有#include <stdio.h>
的情况下编译 - 因为printf()
也将被隐式声明。
注意2:您对f1()
的定义也有未定义的行为,因为b
未初始化且具有自动存储持续时间。访问它的值,更不用说递增它,因此给出了未定义的行为。