关闭

调用函数前未声明会出现什么情况?

标签: 函数调用声明double到float的截断返回值
1800人阅读 评论(0) 收藏 举报
分类:

查看关于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”截断




总结:返回值类型不是整型的函数,在调用前需要先声明!


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55795次
    • 积分:1085
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3条
    博客专栏
    最新评论