爱上C语言:操作符详解(下)

news2025/4/17 6:22:02

🚀 作者:阿辉不一般
🚀 你说呢:生活本来沉闷,但跑起来就有风
🚀 专栏:爱上C语言
🚀作图工具:draw.io(免费开源的作图网站)
请添加图片描述

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正,感谢大家支持!!!

文章目录

  • 🚀前言
  • 🚀整型的存储以及原、反、补码
  • 🚀移位操作符
    • ✈️左移操作符(<<)
    • ✈️右移操作符(>>)
  • 🚀位操作符
    • ✈️一道变态面试题
  • 🚀单目操作符
    • ✈️ 逻辑反操作(!)
    • ✈️sizeof
  • 🚀剩下的操作符
  • 🚀复杂的表达式如何计算
    • ✈️优先级
    • ✈️结合性

🚀前言

大家好啊😉!承接之前的操作符上篇,今天阿辉将介绍剩下的操作符,包括移位操作符,位操作符以及单目操作符,持续输出干货中,关注阿辉不迷路哦 😘 ,内容干货满满😋,接下来就跟着阿辉一起学习吧👊

🚀整型的存储以及原、反、补码

介绍移位操作符和位操作符前得先了解整型在内存中的存储以及原反补码,阿辉上篇文章上篇文章整型的存储里面有详细的讲解(点击直接跳转哦 😘)

🚀移位操作符

移位操作符有何作用?
移位操作符移动的是数据在内存中存储的补码的二进制位,其中移位操作符的“位”字就是指二进制位

移位操作符有左移操作符右移操作符两种

✈️左移操作符(<<)

左移操作符怎么使用呢?

左操作数 << 右操作数
左操作数是要被左移位的数
右操作数是要左移移动的位数

左移操作符的规则就是左边丢弃,右边补0
我们来看一个🌰栗子

int main()
{
	int a = 10;
	0000 0000 0000 0000 0000 0000 0000 1010 ->a原码
	0000 0000 0000 0000 0000 0000 0000 1010 ->a反码 
	0000 0000 0000 0000 0000 0000 0000 1010 ->a补码 
	int b = a << 2;
	0000 0000 0000 0000 0000 0000 0010 1000 ->b补码 b也就是40
	return 0;
}

在这里插入图片描述
是不是有点懵😏,别急阿辉用图演示👇
请添加图片描述
现在是不是对左移操作符用法清晰多了😁 ,上述演示仅仅使用了正数,不过负数同样可以,负数仅仅是多了原反补码之间的转换

✈️右移操作符(>>)

右移操作符的使用

左操作数 >> 右操作数
左操作数是要被右移位的数
右操作数是要右移移动的位数

右移操作符的规则

  • 算术右移:左边补符号位,右边丢弃
  • 逻辑右移:左边补0,右边丢弃

对于使用逻辑右移还是算术右移从语言并未明确规定,但大部分编译器都使用算术右移,对于无符号数使用逻辑右移

算术右移:左移用正数,咱们这次用负数演示👊

int main()
{
	int a = -10;
	1000 0000 0000 0000 0000 0000 0000 1010->a原码
	1111 1111 1111 1111 1111 1111 1111 0101->a反码
	1111 1111 1111 1111 1111 1111 1111 0110->a补码
	int b = a >> 2;
	1111 1111 1111 1111 1111 1111 1111 1101->b补码
	1000 0000 0000 0000 0000 0000 0000 0010
	1000 0000 0000 0000 0000 0000 0000 0011->b原码 也就是-3
	return 0;
}

请添加图片描述

逻辑右移:逻辑右移也与上述算数右移的运算是类似的,不过逻辑右移不管你是正数还是负数,左边通通补0

注意

  • 移位操作符的操作数只能为整型
  • 对于移位运算符,不要移动负数位,这个是标准未定义的
  • a>>1a<<1这两个都不会改变a的值,就像a+1这样并不会改变a的值

🚀位操作符

位操作符分类

& 按位与
| 按位或
^ 按位异或
~ 按位取反
& | ^ 这三个有两个操作数
~ 只有一个操作数

这里的位同样指的是二进制位,它们操作的依然是内存中的补码
&按位与: 两操作数内存中的补码两相同二进制位均为1就为1,其中一个0就为0
🌰栗子

int main()
{
	int a = 3;
	0000 0000 0000 0000 0000 0000 0000 0011 -> 3的原反补码
	int b = -5;
	1000 0000 0000 0000 0000 0000 0000 0101 -> -5的原码
	1111 1111 1111 1111 1111 1111 1111 1010 -> -5的反码
	1111 1111 1111 1111 1111 1111 1111 1011 -> -5的补码
	int c = a & b;
	1111 1111 1111 1111 1111 1111 1111 1011 -> -5的补码
	0000 0000 0000 0000 0000 0000 0000 0011 -> 3的补码
	0000 0000 0000 0000 0000 0000 0000 0011 -> 按位与结果
	符号位为0,原反补码相同,值为3
	return 0;
}

在这里插入图片描述
| 按位或: 两操作数内存中的补码两相同二进制位均为0就为0,其中一个1就为1

|&的用法类似这里就不举例子了

^按位异或: 两操作数内存中的补码两相同二进制位相同为0,相异为1
🌰栗子

int main()
{
	int a = 3;
	0000 0000 0000 0000 0000 0000 0000 0011 ->3原反补码
	int b = 3;
	int c = a ^ b;
	0000 0000 0000 0000 0000 0000 0000 0011 ->3原反补码
	0000 0000 0000 0000 0000 0000 0000 0011 ->3原反补码
	0000 0000 0000 0000 0000 0000 0000 0000 异或结果
	int d = c ^ a;
	0000 0000 0000 0000 0000 0000 0000 0000 ->c
	0000 0000 0000 0000 0000 0000 0000 0011 ->a
	0000 0000 0000 0000 0000 0000 0000 0011 异或结果
	int e = a ^ a ^ b;
	int f = a ^ b ^ a;
	return 0;
}

在这里插入图片描述
由上面的例子,我们可以得到以下结论👇

相同数字异或结果为0即a ^ a = 0,0与任何数字异或仍为该数字即0 ^ a = a
并且^支持交换律与结合律即a ^ b ^ c = a ^ c ^ b

~按位取反: 操作数在内存中的补码按二进制位0改为11改为0
🌰栗子

int main()
{
	int a = 0;
	0000 0000 0000 0000 0000 0000 0000 0000 ->0的原反补码
	1111 1111 1111 1111 1111 1111 1111 1111 ->按位取反结果
	1000 0000 0000 0000 0000 0000 0000 0001 ->原码值为-1
	int c = ~a;
	return 0;
}

在这里插入图片描述
注意:他们的操作数必须为整数

✈️一道变态面试题

不创建新变量交换两个整数

int main()
{
	int a = 10;
	int b = 12;
	a = a ^ b;
	b = a ^ b;
	a = b ^ a;
	return 0;
}

上面代码是不是很懵 😆,第一次我也很懵逼,我们接着看👇

a = a ^ b这时a的值不在是10而是10 ^ 12,然后b = a ^ b实际上是b = 10 ^ 12 ^12,由上面我们知道的^的特点可知10 ^ 12 ^ 12 = 10,这时b = 10,在看这句a = a ^ b实际上是a = 10 ^ 12 ^ 10,而10 ^ 12 ^ 10 = 12这时a = 12所以ab的值完成了交换

🚀单目操作符

单目操作符的分类:

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符)
(类型)       强制类型转换

✈️ 逻辑反操作(!)

🌰栗子

int main()
{
	int a = 0;
	int b = 4;
	if (!(b == 4))
		printf("真");
	printf("%d ", !a);
	printf("%d\n", !b);
	return 0;
}

在这里插入图片描述
逻辑反操作即把0 (假) 改为1 (真) ,非0 (真) 改为0 (假)

✈️sizeof

sizeof这个操作符,sizeof是由来计算变量(类型)所占空间的大小,不关注存储的内容,单位是字节

int main()
{
	int a = 2;
	int b[4] = { 0 };
	char c = '1';
	printf("%u\n", sizeof(b));
	printf("%u\n", sizeof(b[0]));
	printf("%u\n", sizeof(a));
	printf("%u\n", sizeof(c));
	printf("%u\n", sizeof(int));
	return 0;
}

在这里插入图片描述
sizeof的操作数为数组名时计算的整个数组的大小

🚀剩下的操作符

其中有一些过于简单相信大家都掌握了,至于**结构体成员访问操作符(.)和(->)**会在后续结构体章节详细讲到, **解引用操作符(*)和取地址操作符(&)**会在后续数组篇中讲解

🚀复杂的表达式如何计算

C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序

✈️优先级

相邻操作符的优先级高的先算

int main()
{
	int a = 3;
	int b = 4;
	a - b * a;
}

上述代码*乘的优先级更高先算b * a而不是先算a - b

✈️结合性

当相邻两操作符优先级相同就要看结合性了,左结合从左向右计算,右结合从右向左计算

int main()
{
	int a = 3;
	int b = 4;
	a / b * a;
}

上述代码中/*的优先级相同都是左结合,因此先算a / b
下面是一张操作符优先级与结核性的表
在这里插入图片描述
虽然我们知道了操作符的结合性与优先级,但这并不能保证表达式具有唯一计算路径,因此尽量不要写过于复杂的表达式很容易出bug


到这里,阿辉今天对于C语言中操作符的分享就结束了,希望这篇博客能让大家有所收获, 如果觉得阿辉写得不错的话,记得给个赞呗,你们的支持是我创作的最大动力🌹
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1220752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云服务器收费标准是多少?腾讯云服务器收费标准表

你是否曾被繁琐复杂的服务器租赁费用搞得头昏脑胀&#xff1f;看着一堆参数和计费方式却毫无头绪&#xff1f;别担心&#xff0c;这篇文章就来帮你解决这个问题&#xff01;我们今天就来揭秘一下腾讯云服务器的收费标准&#xff0c;让大家轻松明白地知道如何租用腾讯云服务器。…

Linux(2):初探

Linux 是什么 Linux 就是一套操作系统。Linux 就是核心与系统呼叫接口那两层。 应用程序不算 Linux。 Linux 提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构&#xff0c; 这个架构是沿袭Unix 良好的传统来的&#xff0c;相当的稳定而功能强大。 在 Lin…

Kafka学习笔记(二)

目录 第3章 Kafka架构深入3.3 Kafka消费者3.3.1 消费方式3.3.2 分区分配策略3.3.3 offset的维护 3.4 Kafka高效读写数据3.5 Zookeeper在Kafka中的作用3.6 Kafka事务3.6.1 Producer事务3.6.2 Consumer事务&#xff08;精准一次性消费&#xff09; 第4章 Kafka API4.1 Producer A…

typeof null的结果为什么是Object?

在 JavaScript 第一个版本中&#xff0c;所有值都存储在 32 位的单元中&#xff0c;每个单元包含一个小的 类型标签(1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的低位中&#xff0c;共有五种数据类型&#xff1a; 如果最低位是 1&#xff0c;则类型标签标志…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-C

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

YOLOv5 配置C2模块构造新模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营 &#x1f356; 原作者&#xff1a;[K同学啊] &#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb4…

【Kingbase FlySync】界面化管控平台:1.安装部署与用户创建

同步软件安装部署与用户创建 概述准备环境目标资源1.测试虚拟机下载地址包含node1,node22.KFS管控平台工具下载地址3.临时授权下载地址 实操&#xff1a;同步软件安装部署1.node1准备安装环境(1)增加flysync 用户并设置密码(2)调整flysync的最大文件句柄数&#xff08;open fil…

蓝牙耳机仓设计的单芯片解决方案

对于一款优秀的TWS耳机来说&#xff0c;除了耳机本身的音频配置&#xff0c;充电仓也是极为重要的一环。因为与传统有线耳机由设备电池供电不同&#xff0c;缺少了耳机仓&#xff0c;TWS耳机就完全的失去了充电的途径&#xff0c;设备在耗尽电量基本就告别使用了&#xff0c;因…

使用Sqoop命令从Oracle同步数据到Hive,修复数据乱码 %0A的问题

一、创建一张Hive测试表 create table test_oracle_hive(id_code string,phone_code string,status string,create_time string ) partitioned by(partition_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ,; 创建分区字段partition_date&#xff0c…

【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型

1. 引入 QStandardItemModel类提供了一个通用的模型&#xff0c;用于存储自定义数据。 以下是其用法&#xff1a;该类属于gui模块&#xff0c;因此在.pro中&#xff0c;需添加QT gui&#xff0c;如果已存在&#xff0c;则无需重复添加。 首先&#xff0c;引入头文件&#xff…

Python---练习:编写一段Python代码,生成一个随机的4位验证码

案例&#xff1a;编写一段Python代码&#xff0c;生成一个随机的4位验证码 提前&#xff1a;定义一个字符串 str1 "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" 编写Python代码&#xff1a; ① 思考&#xff1a;如果只生成4个字符的验证码&…

go语言 | 图解字节青训营抖音(一)

前言 本文大致介绍了本人及本人所在小组为第五届字节跳动青训营后端专场大项目需求 —— 「实现一个极简版抖音」的部分实现细节。 需求 本届后端青训营大项目要求实现一个极简版抖音的后端服务&#xff0c;该后端服务通过 HTTP 协议向已被设计好的前端 App 传递数据&#xf…

在listener.ora配置文件中配置listener 1527的监听并且使用tnsnames连接测试

文章目录 前言&#xff1a;一、命令语句实现1、监听介绍2、编辑 listener.ora 文件&#xff1a;寻找配置文件对配置文件进行配置 3、重启监听4、配置TNS 二、图形化界面实现1、listener.ora文件配置2、tnsnames.ora文件配置 三、测试连接 前言&#xff1a; 命令实现和图形化实…

网站页头被挂马状态及新增了index.html文件解决思路

今天网站刚新增了篇了文章《从nginx层阻断可执行的php 防止宝塔站点挂马》,整体测试下来还是不靠谱,设置后导致所有PHP文件都打不开了。 经过不断的查看日志和搜索办法总算告一段落,后续待观察。原因如下,多个网站目录新增了index.html文件,看时间是近两天上传的。 网站代…

超级微同城源码系统 轻松制作本地生活服务平台 源码完全开源可二次开发 带完整的搭建教程

现如今&#xff0c;越来越多的人开始依赖网络进行日常生活。各种生活服务平台如雨后春笋般涌现&#xff0c;为人们提供了方便快捷的服务。然而&#xff0c;对于很多传统企业来说&#xff0c;如何将线下业务转移到线上&#xff0c;如何提高服务质量等问题成为了他们面临的重要挑…

YOLO目标检测——机油泄露检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;机械设备维护、工业生产监控、环保监管等数据集说明&#xff1a;机油泄露检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、co…

搭建大型分布式服务(三十六)SpringBoot 零代码方式整合多个kafka数据源

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、创建项目四、测试一下五、小结 前言 让我们来看一下网上是怎样使用SpringBoot整合kafka数据源的&#xff0c;都存在哪些痛点&#xff1f; 痛点一&#xff1a; 手撸kafka配置代码&#xff0c;各种硬编码&a…

cocos3.4.2 2d射线检测 和 animation动画

2D的射线检测 ,注:目标必须有2d刚体和2d碰撞器 ,且项目设置内必须是这个物理系统 //起点位置let objs new Vec2(this.node.getWorldPosition().x, this.node.getWorldPosition().y);// 终点 let obje new Vec2(objs.x 100, objs.y);// 射线检测let results PhysicsSystem2…

Unity中Shader纹理的环绕方式

文章目录 前言一、修改环绕方式前的设置准备二、在纹理的设置面板可以修改环绕方式三、在Shader中&#xff0c;实现纹理的环绕方式切换1、在属性面板定义一个和纹理面板一样的纹理环绕方式下拉框2、在Pass中&#xff0c;定义枚举对应的变体3、在片元着色器中&#xff0c;纹理采…

【数据结构与算法】JavaScript实现树结构(一)

文章目录 一、树结构简介1.1.简单了解树结构1.2.树结构的表示方式 二、二叉树2.1.二叉树简介2.2.特殊的二叉树2.3.二叉树的数据存储 三、二叉搜索树3.1.认识二叉搜索树3.2.二叉搜索树应用举例 一、树结构简介 1.1.简单了解树结构 什么是树&#xff1f; 真实的树&#xff1a;…