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应文件对函数进程声明,从而保证不发生不期望的类型提升。
时间: 2024-09-30 17:05:04