C语言-----操作符的分类
1. 操作符的分类
•算术操作符: + 、- 、 * 、/、%
移位操作符:<< >>
位操作符: & | ^ `
赋值操作符:= / 、 % 、 += 、-= 、 *=、/=、 %=、 <<=、 >>=、&=、|= 、 ^=
单⽬操作符:!、 ++ 、- 、 & 、 * 、 + 、 、 ~ 、 sizeof 、 ( 类型 )
关系操作符:> 、 >= 、 < 、<= 、 == 、 !=
逻辑操作符:&& 、 ||
• 条件操作符: ? :
• 逗号表达式: ,
• 下标引⽤: []
• 函数调⽤: ()
• 结构成员访问: . 、->
2. ⼆进制和十进制转换
2进制
• 2进制中满2进1
• 2进制的数字每⼀位都是0~1的数字组成
比如“1101”
10进制
• 10进制中满10进1
• 10进制的数字每⼀位都是0~9的数字组成
2.1 2进制转10进制
10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进 制的数字从右向左是个位、⼗位、百位....,分别每⼀位的权重是 10 ,10 ,10 ...


举个例子:
比如:二进制1111换为10进制
过程:2^3*1+2^2*1+2^1*1 +2^0*1 将各位的值相加:8 + 4 + 2 + 1 = 15。
二进制数1111转换为十进制数是15。
2.1.1 10进制转2进制数字
例如:5的二进制是101
2.2 2进制转8进制和16进制
2.2.1 2进制转8进制
16进制的数字每⼀位是0~9,a~f的,0~9,a~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了, ⽐如f的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进 制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制:0x6b,16进制表⽰的时候前⾯加0x

3. 原码、反码、补码
整数的2进制表示方法有三种,即原码、反码和补码
有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号 位,剩余的都是数值位。
符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
10000110 -6
00000110 6
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
反码得到原码也是可以使用:取反,+1的操作。
转换关系如下图:

4. 移位操作符
<< 左移操作符
>> 右移操作符
注: 移位操作符的操作数只能是整数。
4.1 左移操作符<<
移位规则:左边抛弃、右边补0
#include <stdio.h>int main(){int num = 10;int n = num<<1;printf("n= %d\n", n);printf("num= %d\n", num);return 0;}
上面代码根据移位规则如下图所示:

10二进制1010经过移位变成10100,计算得20

4.2 右移操作符>>
移位规则:⾸先右移运算分两种:
1. 逻辑右移:左边⽤0填充,右边丢弃
2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
右移到底是算术右移,还是逻辑右移是取决于编译器的实现,常见的编译器都是算术右移
#include <stdio.h>int main(){int num = -1;int n = num>>1;printf("n= %d\n", n);printf("num= %d\n", num);return 0;}


警告⚠:对于移位运算符,不要移动负数位,这个是标准未定义的。
5. 位操作符:&、|、^、~
位操作符有:
1 & //按位与2 | //按位或3 ^ //按位异或4 ~ //按位取反
注: 他们的操作数必须是整数。
5.1.按位与 &
#include <stdio.h>
int main()
{int a = 3;int b = -5;int c = a & b;//3//补码:0000 0000 0000 0000 0000 0000 0000 0011//-5//原码:1000 0000 0000 0000 0000 0000 0000 0101//反码:1111 1111 1111 1111 1111 1111 1111 1010//补码:1111 1111 1111 1111 1111 1111 1111 1011//计算都是拿补码//0000 0000 0000 0000 0000 0000 0000 0011 3//1111 1111 1111 1111 1111 1111 1111 1011 -5//0000 0000 0000 0000 0000 0000 0000 0011 按位与得到补码printf("n= %d\n", c);return 0;
}

如何计算呢,两个补码两个同时唯1才得1,其他为0
5.2.按位或 |
#include <stdio.h>
int main()
{int a = 3;int b = -5;int c = a | b; //3//补码:0000 0000 0000 0000 0000 0000 0000 0011//-5//原码:1000 0000 0000 0000 0000 0000 0000 0101//反码:1111 1111 1111 1111 1111 1111 1111 1010//补码:1111 1111 1111 1111 1111 1111 1111 1011//计算都是拿补码//0000 0000 0000 0000 0000 0000 0000 0011 3//1111 1111 1111 1111 1111 1111 1111 1011 -5//1111 1111 1111 1111 1111 1111 1111 1011 按位或得到补码//经过计算//反码:1111 1111 1111 1111 1111 1111 1111 1010//原码:1000 0000 0000 0000 0000 0000 0000 0101 -5printf("n= %d\n", c); //打印的是原码return 0;
}

如何计算呢,两个补码有一则唯一,两个同时为0才为0
5.3.按位异或 ^
#include <stdio.h>
int main()
{int a = 3;int b = -5;int c = a ^ b; //3//补码:0000 0000 0000 0000 0000 0000 0000 0011//-5//原码:1000 0000 0000 0000 0000 0000 0000 0101//反码:1111 1111 1111 1111 1111 1111 1111 1010//补码:1111 1111 1111 1111 1111 1111 1111 1011//计算都是拿补码//0000 0000 0000 0000 0000 0000 0000 0011 3//1111 1111 1111 1111 1111 1111 1111 1011 -5//1111 1111 1111 1111 1111 1111 1111 1000 按位异或得到补码//经过计算//反码:1000 0000 0000 0000 0000 0000 0000 0111//原码:1000 0000 0000 0000 0000 0000 0000 1000 -8printf("n= %d\n", c);return 0;
}

如何计算呢,两个补码相同为0相异为1
实现值交换:
//a^a 相同为0
//0^a 0和任何数异或为任何数
#include <stdio.h>
int main()
{int a = 10;int b = 20;a = a ^ b;b = a ^ b;//a ^ b ^ b;b=aa = a ^ b;///a ^ b ^ b;->a ^ b ^ a;a=bprintf("a = %d b = %d\n", a, b);return 0;
}
5.4.按位取反 ~
#include <stdio.h>
int main()
{int a = 0;int b = ~a;//0000 0000 0000 0000 0000 0000 0000 0000//1111 1111 1111 1111 1111 1111 1111 1111 --补码//1000 0000 0000 0000 0000 0000 0000 0001 补码取反+1变成原码printf("n= %d\n", b);return 0;
}

计算一个数二进制数1个数:
#include <stdio.h>
int main()
{int a = 0;scanf("%d", &a);int count = 0;int i = 0;//原码:0000 0000 0000 0000 0000 0000 0000 1101 13//原码:0000 0000 0000 0000 0000 0000 0000 0001 1//由此可以看出任意一个数&1可以得到二进制最后一位是1或0for (i = 0; i < 32; i++){if (a & (1 << i))//1经过左位移操作符,二进制里面一一直往前面移动{count++;}}printf("%d\n", count);return 0;
}
6. 单目操作符
单目操作符有这些:
!、++、--、&、*、+、-、~ 、sizeof、(类型)
7. 逗号表达式
1 exp1, exp2, exp3, …expN
逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。
//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?
由此得结果:13//代码2
if (a =b + 1, c=a / 2, d > 0)
逗号表达式从左向右计算,由此起到判断作用是d>0
8. 下标访问[]、函数调用引用()
8.1 []下标操作符
操作数:⼀个数组名+⼀个索引值
int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
[ ]的两个操作数是arr和9。
8.2 函数调用操作符
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数
#include <stdio.h>
void test1()
{printf("hehe\n");
}
void test2(const char *str)
{printf("%s\n", str);
}
int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。 test2("hello bit.");//这⾥的()就是函数调⽤操作符。 return 0;
}
9. 结构成员访问操作符
9.1 结构体
C语言已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,假设我想描述学生,描述⼀本书,这时单⼀的内置类型是不行的。描述⼀个学生需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语言为了解决这个问 题,增加了结构体这种自定义的数据类型。
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚至是其他结构体。
9.1.1 结构的声明
struct stdunt
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};//分号不能丢
9.1.2 结构体变量的定义和初始化
//代码1:变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2//代码2:初始化。
struct Point p3 = {10, 20};
struct Stu //类型声明
{char name[15];//名字 int age; //年龄
};struct Stu s1 = {"zhangsan", 20};//初始化
struct Stu s2 = {.age=20, .name="lisi"};//指定顺序初始化 //代码3
struct Node
{int data;struct Point p;struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
9.2 结构成员访问操作符
9.2.1 结构体成员的直接访问
结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如
下所示:
#include <stdio.h>
struct Point
{int x;int y;
}p = {1,2};
int main()
{printf("x: %d y: %d\n", p.x, p.y);return 0;
}
9.2.2 结构体成员的间接访问
#include <stdio.h>
struct Point
{int x;int y;
};
int main()
{struct Point p = {3, 4};struct Point *ptr = &p;ptr->x = 10;ptr->y = 20;printf("x = %d y = %d\n", ptr->x, ptr->y);return 0;
}
10. 操作符的属性:优先级、结合性
10.1 优先级
1 3 + 4 * 5; 10.2 结合性
1 5 * 6 / 2;
相关文章:
C语言-----操作符的分类
1. 操作符的分类 •算术操作符: 、- 、 * 、/、% 移位操作符:<< >> 位操作符: & | ^ 赋值操作符: / 、 % 、 、- 、 *、/、 %、 <<、 >>、&、| 、 ^ 单⽬操作符:!、 、- 、 & 、 * 、 、 …...
mac os设置jdk版本
打开环境变量配置文件 sudo vim ~/.bash_profile 设置不同的jdk版本路径 # 设置JAVA_HOME为jdk17路径 export JAVA_HOME$(/usr/libexec/java_home -v 17)# 设置JAVA_HOME为jdk8路径 export JAVA_HOME$(/usr/libexec/java_home -v 1.8) 设置环境变量 # 将jdk加入到环境变量…...
深入理解WebSocket接口:如何使用C++实现行情接口
在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...
PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例 目录 PWM(脉宽调制)技术详解:从基础到应用实践示例学前思考:一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…...
Mybatis的#{}和${}
#{}:预编译语句,用?对参数位置进行一个占位的操作,在数据库生成一个模版,等待后续填充.也可以推测出#在生成模版后的性能是比$快的. ${}:即时语句,提前的吧参数填充进去,在MySQL里就是一个完整的SQL语句. 填充逻辑不同 #{}会给String类型的参数自动的加上双引号,而${}则是直…...
【零基础实战】STM32控制DRV8833电机驱动详解
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、DRV8833模块简介二、STM32选型建议三、硬件连接详解1. 接线示意图2. 电源注意事项 四、核心控制原理1. PWM调速原…...
AI智能成长系统 | 应用探讨研究
研究背景 在现代家庭中,三岁宝宝的成长环境日益复杂。由于宝宝每天接触的人群多样,包括家庭成员、同龄小朋友以及可能的陌生人,其语言环境也相应地变得复杂多变。这种环境下,宝宝很容易接触到一些不适宜的语言,即俗称…...
java 网络安全感知 网络安全学java
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 实验五 java网络编程及安全 实验内容 1.掌握Socket程序的编写;2.掌握密码技术的使用;3.设计安全传输…...
VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…...
Node.js 中的 fs 模块详解
fs(File System)模块是 Node.js 的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...
debezium专栏文章目录
debezium专栏文章目录 第一阶段:基础认知篇 CDC革命:为什么说Debezium改变了数据流动方式? 对比Log-Based/Trigger-Based/Query-Based CDC方案Debezium在数据管道中的战略价值 5分钟部署你的第一个Debezium连接器 使用Docker Compose快速搭…...
python-leetcode 40.二叉树的层序遍历
题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…...
蓝桥杯学习大纲
(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、蓝桥必备高频考点 我们以此为重点学习…...
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统,…...
Debezium 报错:“The db history topic is missing” 的处理方法
Debezium 报错:“The db history topic is missing” 的处理方法 一、引言 在使用 Debezium 进行数据同步时,可能会遇到一个常见的错误:“The db history topic is missing”。这个错误表明 Debezium 无法找到或访问其数据库历史记录主题(db history topic),这通常是由…...
水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL8检测报告标准讲解:
水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL检测报告标准讲解: 本政策涵盖的灭火器 水基试剂灭火器 水基试剂灭火器使用水基试剂带走燃烧三要素中的热量要素…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-build.py
build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...
Windows隐藏窗口/开机自启动
目录 使用Start-Process命令控制窗口状态 设置程序开机自启动 使用Start-Process命令控制窗口状态 隐藏窗口运行程序 使用Start-Process命令时,可以通过-WindowStyle Hidden参数让程序在后台运行,窗口不可见。例如: Start-Process D:\note…...
汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
故障现象 一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…...
文件IO(20250217)
1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...
Mac arm架构使用 Yarn 全局安装 Vue CLI
dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI,你可以执行以下命令: yarn global add vue/cli这个命令会全局安装 Vue CLI,让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...
ES6相关操作(2)
一.Promise Promise是ES6引入的异步编程工具。 语法上Promise是一个构造函数,用于封装异步操作并可以获取操作成功或失败的结果 Promise构造函数:Promise(excutor){} Promise的常用函数:then,catch 实例化Promise对象(创建Promise工具) let data"请求数据"//该数据为…...
成员函数定义后面加const是什么功能:C++中const成员函数的作用
成员函数定义后面加const是什么功能:C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中,有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…...
DeepSeek智能测试助手:分类+推理+导出一站式工具
前言 测试开发工程师在日常工作中需要处理大量测试文档,并且这些文档需要被高效分类、清洗和管理,同时结合强大的 AI 推理能力(如 DeepSeek 模型)进行智能化处理和分析。为此,我们开发了一款基于 PyQt5 的 GUI 工具&a…...
【嵌入式Linux应用开发基础】进程间通信(3):共享内存
目录 一、共享内存核心概念 1.1. 特点 1.2. 适用场景 二、共享内存原理剖析 三、嵌入式 Linux 中共享内存的使用 3.1. 相关函数介绍 3.2. System V共享内存操作步骤 3.3. 同步机制(示例使用System V信号量) 3.4. POSIX共享内存(现代…...
日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……”
日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……” 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)寒くなりました & 元気になりました(2)何(なに)になりたいですか。(…...
计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python HTTP 请求工具类 HttpUtils:简化 HTTP 请求的高效工具
在现代的 Web 开发和 API 集成中,HTTP 请求是最常见的操作之一。无论是获取数据、提交表单,还是与 RESTful API 交互,我们都需要频繁地发送 HTTP 请求。为了简化这些操作,提升代码的可读性和可维护性,我们可以使用一个…...
「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件
PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件,以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性,如颜色、字体大小、样式和粗细。…...
【linux】文件与目录命令 - grep
文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项5. 正则表达式5.1 正则表达式元字符5.2 正则表达式常用修饰符5.3 正则表达式运算符优先级5.4 正则表达式匹配规则 grep 命令用于在文本文件或标准输入中查找匹配的字符串模式,是一种功能强大的文本搜索工具&a…...

