查看关于c编程的书籍可以知道,在函数调用之前,要求先声明,这是为了告诉编译器函数返回值的类型,函数接受的参数的类型和个数。而如果函数在调用之前已经定义好了,即编译器知道函数的返回值类型,函数接受什么样的参数以及参数的个数。所以可以得知,告诉编译器有关函数的信息有2中办法:1先定义 2先声明
函数的声明如下(原型):
返回值 函数名 (形式参数类型 形式参数名……);
举个例子: int fan(int * A, char B);如果没有形式参数,那么就写成void;形式参数是一个局部变量,作用域只存在定义他的函数内部,形式参数名字可以省略,其他函数也可以使用相同的形式参数名字,特别注意这个声明后面一个分号,而在函数定义的时候这个分号是用没有的,取而代之的是{
如此声明之后,在调用函数时,编译器就可以检查函数的调用,确保函数的类型,参数等信息没有错误。编译器会把类型不对的实参,返回值按照函数声明的要求转换过来。
问题来了:
如果我们之前没有声明函数就调用了一个函数,会发生什么情况?
#include <stdio.h>
int main(void)
{
int c;
c = sun();
printf("%d",c);
return 0;
}
int sun()
{
return 3;
}
结果是什么呢?结果是3,同时提醒warning C4013: “sun”未定义;假设外部返回 int。如果再改下一些代码
#include <stdio.h>
int main(void)
{
float c;
c = sun();
printf("%f",c);
return 0;
}
float sun()
{
return 3.14;
}
我们得到的结果是-1610612736;
我们返回的值是一个大小为3.14的float型,然后再把3.14赋给float型的c,那么打印出来的结果应该也是3.14
但是我们实际得到的
调试信息:
这是为什么呢?
这是因为在调用sun的时候,编译器不知道sun函数的类型,参数,所以编译器默认函数的返回值是1个整型值,本来3.14是以浮点数存储的,其二进制为01000000010010001111010111000011,于是把这个浮点数方式的存储的二进制当成整数来解读,所以值为-858993472,然后再因为c是float型,所以最后的结果是-858993472.000000(在%f下,默认保存小数点后6位)。所以最上面的代码输出正确完全是刚好碰上了。
所以如果我们在调用前声明,加入语句float sun();输出结果是:
调试信息: warning C4305: “return”: 从“double”到“float”截断
结果是正确显示了,但是为什么会出现 warning C4305: “return”: 从“double”到“float”截断?
原因是:
return 3.14;
在c中,如果不指定数据类型,那么小数常量会被认为是 double 类型的,所以在3.14是double型的,根据float sun()转换成float型,于是会提示从“double”到“float”截断
总结:返回值类型不是整型的函数,在调用前需要先声明!