码迷,mamicode.com
首页 > 编程语言 > 详细

C语言类型转换与原型申明

时间:2016-05-12 17:37:00      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

C语言类型转换与原型申明

关于整型字面值

字面值这个术语是字面常量值的缩写,指定了自身的值,并且不允许发生改变。当有一程序内出现整形字面值时,它是属于整型家庭9种不同类型中的哪一种呢?这取决于如何书写,例如下整型字面值后添加字符L(长整型)、U(无符号整型)。另外,字符常量(例:’M’、’\377’)的类型总是int。

类型转换

c语言中类型转换比一般人想象的要广泛得多。在涉及类型小于int或double的表达式中都可能发生转换。下面程序执行结果是4。

printf("%d",sizeof ‘A‘);

c语言中类型提升:

源类型 通常提升后的类型
char int
位段(bit-field) int
枚举 int
unsigned char int
short int
unsigned short int
float double
任何数组 相应类型的指针

注意:由于函数参数也是表达式,也会发生类型提升。ANSI C中,如果使用了适当的函数原型,类型提升不会发生,否则也会发生。在被调用函数的内部,提升后的参数被裁剪为原先声明的大小。


为了避免类型提升可能带来的一些不便,我们在定义一个函数以后,规范做法是要对该函数进行申明,如果不申明,可能会导致一些不可预测的问题。例如:

lib.c
#include<stdio.h>
void myprintf(float a, char b)
{
    printf("float=%f, char=%c \n", a, b);
}

main.c
#include<stdio.h>
void main()
{
    float a = 12.3;
    char b = 33;
    myprintf(a, b);
}

上面代码中有两个文件,lib.c和main.c, 在main.c中隐式调用了myprintf(),由于没有声明该函数,此时编译器就会对实参a进行类型提升变成double,在函数内部,提升后的参数又被裁剪为float大小。最后,实际输出是:

float=-0.000000, char=!

为了不出现这种错误,应该编写一个.h应文件对函数进程声明,从而保证不发生不期望的类型提升。

C语言类型转换与原型申明

标签:

原文地址:http://blog.csdn.net/ljqhack/article/details/51364570

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!