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

🚀 作者:阿辉不一般
🚀 你说呢:生活本来沉闷,但跑起来就有风
🚀 专栏:爱上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也就是40return 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 00101000 0000 0000 0000 0000 0000 0000 0011->b原码 也就是-3return 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,原反补码相同,值为3return 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 ->c0000 0000 0000 0000 0000 0000 0000 0011 ->a0000 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 ->原码值为-1int 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.hqwc.cn/news/192629.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】泛微e-Weaver SQL注入

漏洞描述 泛微e-Weaver&#xff08;FANWEI e-Weaver&#xff09;是一款广泛应用于企业数字化转型领域的集成协同管理平台。作为中国知名的企业级软件解决方案提供商&#xff0c;泛微软件&#xff08;广州&#xff09;股份有限公司开发和推广了e-Weaver平台。 泛微e-Weaver旨在…

CAS源码工程搭建记录

CAS源码工程搭建 1.下载2.gradle下载源改为阿里云&#xff0c;解决下载慢的问题3.解决保存 1.下载 git clone -b 5.3.x https://gitee.com/mirrors/CAS.git如果下载的是压缩包&#xff0c;导入工程会保存&#xff0c;因为builder.gradle的第20行开始有取git信息&#xff0c;如…

wangEditor富文本编辑器使用

一、官网 开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单 二、下载安装 npm install --save wangeditor/editor-for-vue 三、在vue中使用 3.1、抽离组件editor.vue 在工程的components目录下新建组件editor <template><div><Toolbar:edi…

【漏洞复现】通达oa 前台sql注入

漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…

C_12练习题

一、单项选择题(本大题共20小题,每小题2分&#xff0c;共40分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。) C 风格的注释&#xff0c;也称块注释或多行注释&#xff0c;以&#xff08;&#xff09;…

比亚迪刀片电池与特斯拉4680电池比较

1 电池材料 比亚迪刀片电池采用的磷酸铁锂LFP&#xff08;LiFePO4&#xff09;&#xff0c;特斯拉的4680电池采用的三元锂。 磷酸铁锂&#xff1a;循环寿命长&#xff0c;安全性能好&#xff0c;价格低廉&#xff0c;但是能量密度低&#xff0c;导电性能差&#xff0c;低温表现…

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域&#xff0c;每个领域都有各自的就业前景和价值&#xff0c;以下是对这三个方向的分析&#xff1a; 1、软件开发&#xff1a; 就业前景&#xff1a;随着信息化的加速&#xff0c;软件开发的需求日益增长。…

STM32外部中断(EXTI)与RTOS多任务处理的协同设计

当在STM32上使用外部中断&#xff08;EXTI&#xff09;与RTOS&#xff08;Real-Time Operating System&#xff0c;实时操作系统&#xff09;进行多任务处理时&#xff0c;需要设计合适的协同机制&#xff0c;以确保可靠的中断处理和任务调度。在下面的概述中&#xff0c;我将介…

window系统vscode 编译wvp前端代码

下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;负责实现核心信令与设备管理后台部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等…

【SQL server】 表结构的约束和维护

表结构的约束和维护 修改表结构 (1)添加列 (2)删除列 (3)修改列alter table 表名 add 新列名 数据类型给员工表添加一列邮箱 alter table People add PeopleMail varchar(200)删除列 alter table People drop column PeopleMain修改列 alter table 表名 alter column 列名 数据…

Docker 可视化面板 ——Portainer

Portainer 是一个非常好用的 Docker 可视化面板&#xff0c;可以让你轻松地管理你的 Docker 容器。 官网&#xff1a;Portainer: Container Management Software for Kubernetes and Docker 【Docker系列】超级好用的Docker可视化工具——Portainer_哔哩哔哩_bilibili 环境 …

基于STM32的外部中断(EXTI)在嵌入式系统中的应用

外部中断&#xff08;External Interrupt&#xff0c;EXTI&#xff09;是STM32嵌入式系统中常见且重要的功能之一。它允许外部事件&#xff08;例如按键按下、传感器触发等&#xff09;通过适当的引脚触发中断&#xff0c;从而应用于各种嵌入式系统中。在STM32微控制器中&#…