从零开始的C语言-----操作符深入讲解

AI的出现,是否能替代IT从业者? 10w+人浏览 1.5k人参与

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、移位操作符:<<(左移)、>>(右移)

  1. 左移操作符 <<
    规则:左边丢弃,右边补 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;
}
  1. 右移操作符 >>
    规则:
    逻辑右移(无符号数):右边丢弃,左边补 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,结果才是 1
int a = 5;  // 0101
int b = 3;  // 0011
int c = a & b; // 0001 → 十进制1
  1. 按位或 |:对应位有一个为 1,结果就是 1
int a = 5;  // 0101
int b = 3;  // 0011
int c = a | b; // 0111 → 十进制7
  1. 按位异或 ^:对应位不同,结果为 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;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值