目录
enum
枚举:一个一个列举出来
是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围
作用:提高代码可读性、安全性
枚举类型
enum 枚举名
{
列举各种值//枚举元素(枚举常量)
};
表示定义了一种枚举类型
注意:
- 列举的各种值之间逗号隔开,不需要写类型名
枚举元素大写以便于和其他变量区分
- 枚举中逐个列举的值默认从0开始
如果有给定的值,则后续没有给值的枚举成员值依次+1
- 枚举类型的 本质实际上是一个int类型的数据
- 枚举类型的变量与整型类型的变量通用
- 与宏定义的对比
使用阶段不一样:
宏定义——预处理阶段
枚举——编译阶段要检查语法、运行阶段参与代码运行
可读性:
都提高了可读性,枚举更能说明有相关性的一些值的关系
typedef
type define 本意不是定义类型,给类型起别名
int a;定义一个int型变量a
type int a;此时a是int类型的一个别名
struct stu
{};
struct stu s;
typedef struct stu stu_t;
stu_t s1;
原始方式:struct stu s;
需要显式地写出 struct
关键字。
使用 typedef
别名后的方式:stu_t s1;
可以直接使用 stu_t
来定义变量,无需再写 struct
。
这种使用 typedef
创建别名的方式,特别适用于定义结构体、联合体以及指针类型,使代码更简洁、更易读。尤其是在定义复杂的结构体或指针类型时,typedef
可以极大地简化代码书写
位运算
C语言特点
可以直接操作二进制位
&与运算
(区别&&逻辑与运算)
运算规则:一假则假
清0
0xaa&0x33
1010 1010
& 0011 0011
————————
0010 0010 0x22
|或运算
运算规则:一真则真
复1
0xaa|0x33
1010 1010
| 0011 0011
————————
1011 1011 0xbb
~取反
规则:真假相对
~0xaa
~1010 1010
——————
0101 0101 0x55
^异或
运算规则:相同为0,不同为1
加密、两个数交换
0xaa^0x33
1010 1010
^ 0011 0011
————————
1001 1001 0x99
0x99^0x33 = 0xaa
两个数交换
a = a^b;
b = a^b;
a = a^b;
注意:
浮点数不能做位运算
<<左移
a<<n表示将a这个数据左移n位
左移1位相当于乘2,n位就是乘2的n次方
注意:最低位补0
假设
a = 3
,其二进制表示为00000011
a << 1
:左移1位后变为00000110
,对应的十进制值为6
。这相当于3 * 2 = 6
a << 2
:左移2位后变为00001100
,对应的十进制值为12
。这相当于3 * 4 = 12
>>右移
a<<n表示将a这个数据左移n位
左移1位相当于除2,n位就是除2的n次方
右移看符号位、看数据类型
右移操作有两种主要类型:算术右移和逻辑右移
算术右移(针对有符号数)
如果是有符号类型的数据右移时,最高位补符号位
-
符号位:算术右移时,保留了数值的符号(即正负)。最高位会补符号位,这意味着如果数值是负数,最高位补
1
;如果是正数,最高位补0
。 -
适用:适用于有符号整数的数据类型。
如果
a = -4
(32位有符号整数,二进制表示为
11111111 11111111 11111111 11111100
),执行
a >> 1
,右移1位后,结果是
11111111 11111111 11111111 11111110
,对应的十进制值为-2
。
逻辑右移(针对无符号数)
如果是无符号类型的数据右移时,最高位补0
-
符号位:逻辑右移时,不保留符号位的特性,最高位始终补
0
。 -
适用:适用于无符号整数的数据类型。
如果
a = 4
(32位无符号整数,二进制表示为
00000000 00000000 00000000 00000100
),执行
a >> 1
,右移1位后,结果是
00000000 00000000 00000000 00000010
,对应的十进制值为2
。