一、C语言的数据类型
1.基本数据类型
整型、实型(也可以换成浮点型)、字符型
2.构造类型
又称组合类型,由基本类型按照某种规则组合而成
①数组:相同数据类型的元素组成的集合
②结构体:不同数据类型构成的混合的数据结构
不同数据类型的成员在内存中占据不同的内存单元
③共用体:类似结构体,不同的是构成共同体的数据成员共用一段内存单元
④枚举:将变量的值一一列举出来;变量的值只限于列举的值的范围之内
3.指针类型
用于存储其他变量的地址,而不能存储数据;在内存中占据1个存储单元
【注】只有整型才有无符号型;浮点型和双精度型只有十进制
4.各个类型所占据的字节数
int -- 4
unsigned int -- 4
short -- 2
unsigned short -- 2
long -- 4
unsigned long -- 4
long long -- 8
unsigned long long -- 8
float -- 4(6位有效数字)
double -- 8(15位有效数字)
二、常量和变量
转义字符:用反斜杠'\'引导的,具有特定含义的字符
转义字符的特征是以'\'作为开头
'\n':换行 '\r':回车符 '\t':水平制表符
'\\':反斜杠 '\,':逗号 '\0':空字符 '\b':退格符
'\ddd':1~3位八进制数
'\xhh':1~2位十六进制(以x开头)
符号常量:用#define指定一个符号名称,代表一个常量
(1)12.7f,浮点型,合法 (2)0986,0开头表示8进制,8进制只有0~7,不合法
(3)0986.012,浮点型没有八进制和十六进制,系统会自动忽略所有的0,合法
(4)0625L,八进制长整型,合法 (5)87U,无符号整型,合法
(6)-0x98C2,十六进制,合法 (7)01a,八进制,不合法
(8)指数,合法 (9)指数e右边应为整数而不能为小数,不合法
(10)指数e左右数值均不能缺省,不合法
(11)十六进制,合法 (12)长整型,合法 (13)转义字符,合法
(14)整型,合法 (15)十六进制,合法
(16)指数e右边应为整数而不能为小数,不合法
(17)十六进制,合法 (18)指数e左右数值均不能缺省,不合法
(19)指数,合法 (20)八进制,不合法 (21) ~ (24)均合法
(25)十六进制没有数值,不合法
int a = ‘a’; –> a的值为97
char b = 48; –> b的值为字符‘0’
三、运算符的优先级与结合性
++ --只用于变量,不用于常量 or 表达式
a = i++; // 先将i赋值给a,再执行i+1 --> 结果a = 10, i = 11
a = ++i; // 先将i自增1,再将i赋值给a --> 结果a = 11, i = 11
【例】
int a = 8, b = 7;
printf("%d,%d\n", ++a, b--); // 输出结果为:a == 9, b == 7
优先级顺序:! > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 > ','
算术运算符:+ - * / %(注意先乘除,后加减)
关系运算符:> < >= <= == !=
逻辑运算符:&& || ! 【注意:&&的优先级大于||的优先级!】
【注意:在&&和||的使用下,可能会产生短路现象!】
赋值运算符:= += -= *= /= %=
【例】设a b c均为int型变量
则执行语句a = b = 3; c = ++a || ++b后,b的值为?
预处理c = ((++a) || (++b));
++a表达式的值为4即为真
由于后面为'||'运算,因此'||'右边的部分不计算,出现短路现象
因此++b没运算,则得到b的值为3
【同步练习】
设x y z t均为int型变量
则执行以下语句:x = y = z = 0; t = x++ || y++ && ++z;
后x、y、z、t的值分别为?
预处理t = ((x++) || ((y++) && (++z)))
根据优先级:先算&&两边的内容
y++表达式的值为0,因此发生短路:++z不计算,所以z的值不变(z == 0)
x++表达式的值为0,且||右边的值也为0,因此t的值为
但因为最终x、y分别进行了自增操作,所以x == 1, y == 1
综上:x ==1 y == 1 z == 0 t == 0
四、位运算符
一般使用于两个二进制数之间的运算(计算机会先将数字转换为二进制)
&:同1为1,其他为0
|:有1为1,皆0为0
^:相同为0,不同为1
~:取反,0变1,1变0
<<:二进制左移运算符,向高位移动2位,低位补0
>>:二进制右移运算符,向低位移动2位,高位补0
【注】左移运算符,左移1位相当于乘2,且效率比乘2高
右移运算符,右移1位相当于除2,且效率比除2高
【例】
设有定义int x = 1, y = -1;
则执行语句printf("%d\n", (x--&--y);
执行结果为?
x--的表达式值为1,--y表达式值为-2
等价于:1 & -2
【注】int占32bit(4位,每一位有8个bit)
1 --> 0000 0000 0000 0000 0000 0000 0000 0001
-2 --> 先找2的二进制(0000 0000 0000 0000 0000 0000 0000 0010)
再按位取反(1111 1111 1111 1111 1111 1111 1111 1101)
最后+1(1111 1111 1111 1111 1111 1111 1111 1110)
发现1的二进制位和-2的二进制位,没有相同的位
因此结果为0000 0000 0000 0000 0000 0000 0000 0000 --> 0
【总结】如何求解负数的二进制?
①先写出对应的正数的二进制
②将整数的二进制按位取反
③+1
【同步练习】
short int a = ~0x13;
问a的值为?
【注】short int占16bit(2位,每一位有8个bit)
0x13为十六进制,转为二进制为0000 0000 0001 0011 --> 19(十进制)
再取反:1111 1111 1110 1100
由于反码+1,即可得到该补码的值,即该数的相反数-19
所以不+1,即为-20
因此:a == -20
【例】
char x = '3', y = '6', z;
z = (x ^ y) << 2;
z的二进制数为?
x、y转为十进制数分别为51、54
【注】char占8个bit(1位,每一位有8个bit)
x的二进制数为0011 0011
y的二进制数为0011 0110
x ^ y的值为0000 0101
所以:(x ^ y) << 2的值为0001 0100
【例】float b = 3; int c = 1.5; int e = b / c;
问:e的值为多少?
由于c是int型,所以存放的为数值1
则e = 3 / 1 == 3
【总结】float和int做运算,应先将float型数据转化为int型!
【错题】
1.在C语言中,合法的实型常数是( )
A. 5E2.0 B. E-3 C. .2E0 D. 1.3E
2.在C语言中,逗号运算符的优先级最低。( )
在C语言中,+ - * / %是算术运算符,可用于整型和实型的运算。( )
3.在C语言中,以下非法的表达式是( )
A.0 <= x <= 100 B.i = j == 0 C.(char)(65 + 3) D.x + 1 = x + 1
4.在C语言中,以下非法的表达式是( )
A.j++ B.++(i + 1) C.x = j > 0 D.k = i == j
5.若有定义语句:int x = 12, y = 8, z;
在其后执行语句z = 0.9 + x / y;
则z的值为?
【答案】
1.C
2.× ×(%不可用于整型)
3.D
4.B
5.1