往期回顾
1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】 printf
6.【第三章】 scanf
7.【第三章】 putchar
8.【第三章】 getchar
9.【第三章】 sizeof
10.【第三章】 strlen
11.【第三章】 define
12.【第四章】运算符第一节
13.【第四章】运算符第二节
14.【第四章】运算符第三节
15.【第四章】运算符第四节
通常,在语句和表达式中应当使用的是类型相同的变量和常量。但是如果是混合类型的,C会采用一套自动类型转化
类型转化规则如下:
1:当类型转换出现在表达式时,无论了unsigned还是signed的char和short都会自动转化成int,float会被自动转化成double。由于都是从小类型转化大类型,所以这些欣慰叫做/*升级*/
2:涉及两种类型的运算,两个值会被分别转化成两种类型的更高级别。
3:类型的级别类型是(由高到低)
long double、double、float、float、unsigned long long、long long、unsigned long、long、unsigned int、int
特殊情况:当long和int的大小相同时,unsigned int 比long级别高
4:在赋值表达式语句中,计算的最终结果都会被转换成被赋值变量的类型,这个过程可能导致类型升级或者降级,所谓/*降级*/、是指把一种类型转化成更低的类别
类型的升级一般都不会有什么问题,但是降级会导致真正的麻烦
原因:较低类型可能放不下高类型的值
如果待赋值得值与目标类型不匹配得话得规则:
1:目标类型是无符号得整形,且待赋值得值是整数得时,额外的位将会被忽略
例如:如果目标是8位unsigned char,待赋值是原始值求模256
2:如果目标类型是一个有符号的整数,且待赋值的值是整数,结果因实现而异。
3:如果目标类型是一个整形,且待赋值的值是浮点数,这种行为未定义
4:如果把一个浮点值转化位整形,原来的浮点值将被截断
例程:
#include <stdio.h>
int main(void)
{
char ch;
int i;
float fl;
fl = i = ch = 'C'; /* line 9 */
printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 10 */
ch = ch + 1; /* line 11 */
i = fl + 2 * ch; /* line 12 */
fl = 2.0 * ch + i; /* line 13 */
printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 14 */
ch = 1107; /* line 15 */
printf("Now ch = %c\n", ch); /* line 16 */
ch = 80.89; /* line 17 */
printf("Now ch = %c\n", ch); /* line 18 */
return 0;
}