为什么以下程序运行正常?
int main()
{
int x;
x = foo();
printf("%d",x);
getchar();
return 0;
}
int foo()
{
return 2;
}
而不是这个程序?
//double function(void);
int main(){
double val;
val = function();
printf("%ul\n",val);
}
double function(void){
double num;
num = DBL_MAX;
printf("%ul\n",num);
return num;
}
根据我的理解,main()
之前不存在这两种情况下的功能定义。那么为什么在第一种情况下,无论如何都要调用函数,即使编译器在main()
之前没有它的定义而不是第二种情况?
答案 0 :(得分:7)
由于隐式函数声明,编译器默认假定未指定的类型为int
。
在第一种情况下,这是巧合,但在第二种情况下则不然。
答案 1 :(得分:6)
任何称为函数C的函数默认为int类型,没有参数(例如在第一种情况下)。如果编译器然后找到符合的函数,则没有错误。
在第二种情况下,编译器编译main(),认为函数是int,但后来发现它不正确,并报告错误!
评论:Jonathan Leffler评论道:
仅限C89 / C90。不在C99;不是在C11。当然,一些供应商仍然 只实现C89;一个值得注意的例子是微软!
答案 2 :(得分:1)
在C中,如果定义了函数,则其隐式返回类型为int
。
在第一种情况下,函数的返回类型为int
,因此main()
识别函数并编译而没有任何错误。
在第二种情况下,函数的返回类型为double
,因此main()
无法识别函数,从而生成错误,因此您需要声明函数原型。
同样在旧版本中,直到C89,如果没有提到返回类型,那么它被隐含地视为int
。
在C99标准中,即使返回类型为int
,也不允许返回返回类型。
有关详细信息,请查看:implicit return type C