C语言之运算符篇
C语言之运算符篇
预处理指令与宏定义
1. 预处理指令
预处理指令以" # “开头,是在 编译之前 由预处理器处理的指令。预处理器负责以下任务:
头文件包含
宏定义
条件编译
2. 头文件包含
#include:用于包含头文件。
头文件通常包含以下内容:
函数声明
宏定义
类型定义
功能:使得程序可以使用这些功能。
3. 宏定义
#define:用于定义宏。
对象宏:用于定义常量。
函数宏:用于定义简单的函数。
#define 代表名称 被代表 –>#define name stuff
- 示例:
#define M 100 // 定义常量 M,值为 100
#define STR "hehe" // 定义字符串常量 STR
#define reg register // 定义关键字 reg
printf("M 的值为:%d\n", M); // 输出:M 的值为:100
printf("STR 的值为:%s\n", STR); // 输出:STR 的值为:hehe
位运算
位运算符用于 直接操作整数在内存中存储的二进制位。以下是常见的位运算符及其功能:
1. 按位与(&
)
功能:将两个操作数的对应位进行比较,只有当两个操作数对应位都为 1 时,结果的对应位才为 1,否则为 0。
示例:
int a = 5; // 二进制:00000101
int b = 3; // 二进制:00000011
int result = a & b; // result 的值为 1,二进制:00000001
printf("a & b = %d\n", result); // 输出:a & b = 1
2. 按位或(|
)
功能:将两个操作数的对应位进行比较,只要两个操作数对应位中有一个为 1,结果的对应位就为 1,否则为 0。
示例:
int a = 5; // 二进制:00000101
int b = 3; // 二进制:00000011
int result = a | b; // result 的值为 7,二进制:00000111
printf("a | b = %d\n", result); // 输出:a | b = 7
3. 按位异或(^
)
功能:将两个操作数的对应位进行比较,当两个操作数对应位不同时,结果的对应位为 1,相同时为 0。
示例:
int a = 5; // 二进制:00000101
int b = 3; // 二进制:00000011
int result = a ^ b; // result 的值为 6,二进制:00000110
printf("a ^ b = %d\n", result); // 输出:a ^ b = 6
4. 按位取反(~
)
功能:将操作数的每一位进行取反,即 0 变为 1,1 变为 0。
注意:在有符号整数中,取反会影响符号位,需要考虑补码表示。
示例:
int a = 5; // 二进制:00000101 (8位)
int result = ~a; // result 的值为 -6,二进制:11111010 (补码)
printf("~a = %d\n", result); // 输出:~a = -6
5. 左移(<<
)
功能:将操作数的二进制位向左移动指定的位数,右边补 0。左移一位相当于乘以 2。
示例:
int a = 5; // 二进制:00000101
int result = a << 2; // result 的值为 20,二进制:00010100
printf("a << 2 = %d\n", result); // 输出:a << 2 = 20
6. 右移(>>
)
功能:将操作数的二进制位向右移动指定的位数。
逻辑右移:左边补 0。
算术右移:左边补符号位。
注意:具体使用哪种右移方式取决于编译器和数据类型。
示例:
int a = 5; // 二进制:00000101
int result = a >> 2; // result 的值为 1,二进制:00000001
printf("a >> 2 = %d\n", result); // 输出:a >> 2 = 1
int b = -5; // 二进制:11111011 (补码)
int result2 = b >> 2; // result2 的值取决于编译器,可能是 -2 或其他值
printf("b >> 2 = %d\n", result2); // 输出:b >> 2 = -2 (取决于编译器)
注意: 运算符优先级最⾼的是(⼀元运算符),如 ++ 、 – 、 ! 等,其次是(算术运算符),最后是 赋值运算符。( 计算机会按照优先级来计算,就跟数学上的加减乘除一样
)
位操作技巧
这里是我新认识的通过二进制位进行操作的。
1. 位设置
功能:将一个整数的特定位设置为 1。
示例:
unsigned char num = 0b00000000; // 初始值为 0
unsigned char mask = 0b00000100; // 掩码
unsigned char newNum = num | mask; // 设置第 2 位为 1
printf("New number: %d\n", newNum); // 输出:New number: 4
2. 位清除
功能:将一个整数的特定位设置为 0。
示例:
unsigned char num = 0b11111111; // 初始值为 255
unsigned char mask = ~0b00000100; // 掩码
unsigned char newNum = num & mask; // 清除第 2 位
printf("New number: %d\n", newNum); // 输出:New number: 251
3. 判断奇偶数
功能:使用位运算快速判断一个整数是奇数还是偶数。
原理:如果
num & 1
的结果为 1,则为奇数;否则为偶数。示例:
int num = 7;
if (num & 1) {
printf("%d 是奇数\n", num); // 输出:7 是奇数
} else {
printf("%d 是偶数\n", num);
}
int num2 = 6;
if (num2 & 1) {
printf("%d 是奇数\n", num2);
} else {
printf("%d 是偶数\n", num2); // 输出:6 是偶数
}
4. 交换两个变量的值
功能:使用位运算在不使用额外变量的情况下交换两个变量的值。
示例:
int a = 5;
int b = 3;
printf("交换前:a = %d, b = %d\n", a, b); // 输出:交换前:a = 5, b = 3
a ^= b; // a = 5 ^ 3 = 6 (0101 ^ 0011 = 0110)
b ^= a; // b = 3 ^ 6 = 5 (0011 ^ 0110 = 0101)
a ^= b; // a = 6 ^ 5 = 3 (0110 ^ 010