目录

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