hello,大家好,操作符是C语言中的重要组成部分,今天就让我们来深入了解操作符。
操作符深入讲解
-
操作符的分类
-
二进制和进制的转换
-
原码,补码,反码
-
移位操作符
-
位操作符
-
逗号表达式
-
结构成员访问操作符
-
操作符的属性:优先级。结合性
-
表达式求值
1. 操作符的分类
算术操作符:+、-、*、/、%(加减乘除、取模)
关系操作符:>、<、>=、<=、==、!=(比较大小 / 相等)
逻辑操作符:&&、||、!(与、或、非)
位操作符:&、|、^、~(按位与、或、异或、取反)
移位操作符:<<、>>(左移、右移)
赋值操作符:=、+=、-=等(赋值 / 复合赋值) 特殊操作符:逗号表达式、成员访问符等
下面是基础算数操作符的具体应用
==
&&
?:
||
!=



2,二进制以及八进制十六进制之间的转换
首先认识二进制,十进制,八进制,十六进制 。
二进制: 满 2 进 1,只有 0、1 两个数字(比如 “101”);
八进制: 满 8 进 1,数字是 0-7(比如 “52”);
十六进制: 满 16 进 1,数字是 0-9 + A-F(A=10,F=15,比如 “3F”)。
二进制转八进制:从右往左,每 3 位二进制数对应 1 位八进制数(不足补 0)。
例:二进制10110 → 补 0 成010 110 → 对应八进制2 6 → 结果26。
八进制转二进制:每 1 位八进制数拆成 3 位二进制数。
例:八进制52 → 5=101,2=010 → 结果二进制101010。
二进制转十六进制:从右往左,每 4 位二进制数对应 1 位十六进制数(不足补 0)。
例:二进制110101 → 补 0 成0011 0101 → 对应十六进制3 5 → 结果35。
十六进制转二进制:每 1 位十六进制数拆成 4 位二进制数。
例:十六进制3F → 3=0011,F=1111 → 结果二进制00111111。
八进制转十进制 按 8 的幂次展开相加。
十六进制转十进制:按 16 的幂次展开相加。
3.原码、补码、反码(位运算的前提)
计算机中整数以 “补码” 存储,原因是用补码可以把减法转成加法运算。以 8 位有符号数为例(最高位是符号位:0 = 正,1 = 负):
原码 直接表示正负的二进制
(如 +5 原码 00000101;-5 原码 10000101)
反码:正数反码 = 原码;负数反码 = 原码符号位不变,其余位取反(如 -5 反码 11111010)
补码:正数补码 = 原码;负数补码 = 反码 + 1
(如 -5 补码 11111011)
4、移位操作符:<<(左移)、>>(右移)
- 左移操作符 <<
规则:左边丢弃,右边补 0,相当于 “乘以 2 的 n 次方”。
#include <stdio.h>
int main() {
int a = 5; // 二进制补码:00000000 00000000 00000000 00000101
int b = a << 1; // 左移1位 → 00000000 00000000 00000000 00001010 → 十进制10
printf("b = %d\n", b); // 输出:b = 10
return 0;
}
- 右移操作符 >>
规则:
逻辑右移(无符号数):右边丢弃,左边补 0;
算术右移(有符号数):右边丢弃,左边补符号位(正数补 0,负数补 1),相当于 “除以 2 的 n 次方”。
#include <stdio.h>
int main() {
int a = 10; // 补码:00000000 00000000 00000000 00001010
int b = a >> 1; // 算术右移1位 → 00000000 00000000 00000000 00000101 → 5
int c = -10; // 补码:11111111 11111111 11111111 11110110
int d = c >> 1; // 算术右移1位 → 11111111 11111111 11111111 11111011 → -5
printf("b = %d, d = %d\n", b, d); // 输出:b = 5, d = -5
return 0;
}
计算机都是以补码的形式存储数据的
5.位操作符:&、|、^、~
位操作是直接对二进制位运算,操作的是补码。
- 按位与 &:对应位都为 1,结果才是 1
int a = 5; // 0101
int b = 3; // 0011
int c = a & b; // 0001 → 十进制1
- 按位或 |:对应位有一个为 1,结果就是 1
int a = 5; // 0101
int b = 3; // 0011
int c = a | b; // 0111 → 十进制7
- 按位异或 ^:对应位不同,结果为 1;相同为 0
int a = 5; // 0101
int b = 3; // 0011
int c = a ^ b; // 0110 → 十进制6
6、逗号表达式
逗号表达式的结果是最后一个表达式的值,优先级很低。
int a = (1+2, 3*4, 5-6);
// 逗号表达式结果是5-6=-1,所以a=-1
7、结构成员访问操作符
. :直接访问(结构体变量)
->:间接访问(结构体指针)
#include <stdio.h>
struct stu {
char name[20];
int age;
};//定义结构体
int main() {
struct stu p = {"张三", 20};//结构体的初始化
struct stu *p_ptr = &p;
printf("姓名:%s,年龄:%d\n", p.name, p.age); // .直接访问
printf("姓名:%s,年龄:%d\n", p_ptr->name, p_ptr->age); // ->指针访问
return 0;
}
完
1218





