在printf语句中调用c函数?

时间:2017-06-27 10:23:23

标签: c

此代码的输出是什么?

#include<stdio.h>
//int a;
int main()
{
int a=2;
printf("%d",f1());
}
void f1()
{
int b;
++b;
}

我没有为f1()指定原型,即使它的打印 输出为0,有人可以解释一下吗? 即使函数的返回类型是,也会打印相同的输出 INT

2 个答案:

答案 0 :(得分:2)

它被称为Implicit Function Declaration,它已经过时了。因为f1()没有声明,所以编译器会隐式声明它。在隐式声明中,函数返回int,这就是为什么它的行为却是如此,

  1. 这是未定义的行为,因为f1()未返回int
  2. 这是一个过时的“功能”,编译器应该通过警告告诉你。

答案 1 :(得分:1)

在1989 C标准(以及C的早期预标准版本)中,任何试图调用它的函数都隐式声明了一个函数。隐式声明是函数接受变量参数列表,并返回int

因此,由于您的printf()语句在没有前面声明f1()的情况下调用f1(),编译器会假定它是一个返回int的函数(并且可以接受任何数字)论点)。然后行为是未定义的,因为函数随后被定义为返回void(即它与隐式声明不一致)。

在C99及更高版本中,这通常会导致编译错误。默认情况下,大多数C89编译器以静默方式接受隐式声明,但可以配置(更高的警告级别)以发出警告。某些供应商的某些编译器(特别是gcc)继续支持隐式声明,即使在编译后来的C标准时,仍默认配置为不发出警告。

注1:如果您的编译器接受f1()的隐式声明,它可能也会在没有#include <stdio.h>的情况下编译 - 因为printf()也将被隐式声明。

注意2:您对f1()的定义也有未定义的行为,因为b未初始化且具有自动存储持续时间。访问它的值,更不用说递增它,因此给出了未定义的行为。