语句和表达式通常只应该使用一种类型的常量和变量
如果使用混合类型,C将会使用一个规则集合自动完成类型转换
一、基本的规则
1)当出现在表达式中时,有符号和无符号的char类型和short类型都将自动被转换为int(在需要的情况下将自动被转换为unsigned int);在K&R C下,float将被自动转换为double;因为这种自动转换都是将原来的类型转换为较大的类型,所以被称为提升
2)在包含两种数据类型的任何运算中,两个值都被转换为两种数据类型中较高的级别
3)类型级别从高到低:long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int;当long和int具有相同大小时,unsigned int > long;short和char会被自动提升为int或unsigned int
4)在赋值语句中,计算的最后结果被转换为将要被赋值的那个变量的类型;该过程可能导致提升,也可能导致降级(demotion,将一个值转换成一个更低级的类型)
5)当作为函数的参数进行传递时,char和short会被转换为int,float会被转换为double
升级通常是一个无损害的过程,但是降级可能导致问题:令数据丧失精度
示例代码:
#include <stdio.h>
int main(void)
{
int i = 1000;
char c;
c = i;
printf("The value of c is %c \n", c);
return 0;
}
运行结果:
二、指派运算符
通常应该避免自动类型转换,尤其是避免降级
当需要准确的类型转换时,可以使用指派(cast),即在变量前面放置用圆括号括起来的被希望转换成的类型名,圆括号和类型名一起构成指派运算符(cast operator)
示例代码:
#include <stdio.h>
int main(void)
{
int a, b;
float c;
a = 1.1;
b = (int) 1.1;
c = (float) 1;
printf("%d %d %f \n", a, b, c);
return 0;
}
运行结果:
三、带有参数的函数
函数中的变量名是局部的。不会与函数外部程序其他地方的相同名称冲突
原型(prototype)是一个函数声明,描述函数的返回值和它的参数
一般如果需要在main()函数中调用某函数,其函数声明需要放在main()函数之前
在需要使实际参数的类型与原型保持一致时,编译器会自动插入类型指派,将实参转换为形参的类型
示例代码:
#include <stdio.h>
int summ(int a, int b); // 原型
int main(void)
{
int sum1;
int sum2;
sum1 = summ(10, 20); // 调用1
sum2 = summ(10.5, 20.8); // 调用2
printf("sum is %d %d \n", sum1, sum2);
return 0;
}
int summ(int a, int b)
{
int res;
res = a + b;
return res;
}
运行结果:
好的编程习惯之一是不依赖于自动类型转换