c++ 位运算_C语言之运算符

运算符代表的是各种各样的运算(操作)

已知的运算符:+ - * / =(赋值)

1.运算符的分类

运算符的分类方法很多,通常用功能或者操作数个数进行分类

功能:算数运算符 逻辑运算符 位运算符 地址运算符.......

操作数个数:单目运算符 双目运算符 三目运算符

(1)算数运算符

+ - * / %(取余)

自增运算符(++)和自减运算符(--)的作用是对变量进行加一和减一的操作

他们都是单目运算符,只需要一个操作数

他们的使用方法有两种:前操作和后操作

前操作: ++变量名;                --变量名; 后操作: 变量名++;                变量名--;

前操作的优先级非常高,通常在一条语句中最先执行

后操作的优先级非常低,通常在一条语句中最后执行

注意:

不要在一个表达式中多次使用自增和自减运算符,容易造成歧义

(2)关系和逻辑运算符

关系和逻辑运算符的计算结果是一个布尔值(真or假),使用关系和逻辑运算符就可以构成逻辑表达式。

关系运算符的优先级低于算数运算符

双目的关系运算符包括 == > < >= <= !=

表达式成立,结果就为1,不成立,结果就为0

逻辑运算符可以构成复杂的逻辑表达式,逻辑运算符的优先级比关系运算符要低

逻辑运算符包括 !(取反) &&(与) ||(或)

!是一个单目的逻辑运算符,作用是将一个布尔值(逻辑表达式)取反

与(&&)和或(||)属于双目运算符,他们的作用就是构造复杂的逻辑表达式

与和或的运算规则:

b36d95dbd8e18208d99135941c9e4244.png

逻辑与,逻辑或运算规则

记忆口诀:与运算----全1为1,其他为0

或运算----全0为0,其他为1

短路特性:

与运算和或运算具有短路的特性,如果前一个表达式的已经可以决定整个表达式的结果,此时不会去计算后一个表达式。

(3)位运算符

位运算就是对操作数进行对应的位之间的运算

以下运算都属于位运算:

& ----------- 按位与

| ------------ 按位或

^ ----------- 按位异或

~ ----------- 按位取反(单目)

<< --------- 按位左移

>> --------- 按位右移

1)按位与 ---- &

按位与将操作数对应的位进行与运算

3 & 5   = 0011 & 0101   = 0001  = 1

按位与可以将一个数字的某些二进制位清0

任何数与上0结果为0,任何数与上1结果不变

xxxx xxxx & 1111 0111 = xxxx 0xxx

2)按位或 ---- |

按位或将操作数对应的位进行或运算

3 | 5   = 0011 | 0101   = 0111   = 7

按位与可以将一个数字的某些二进制位置一

任何数或上0结果不变,任何数或上1结果位1

xxxx xxxx | 0000 1000 = xxxx 1xxx

3)按位异或 ----- ^

按位异或就是对应位进行异或运算

异或运算的运算方法是 相同为0,不同为1

46161cb3d2608f24c4bd8b96d20d5cd5.png

异或运算规则

3 ^ 5   = 0011^0101   = 0110   = 6

按位异或可以将一个数字的某些二进制位取反

任何一个数异或上1取反,任何一个数异或上0不变

xxxx xxxx ^ 0000 1000 = xxxx yxxx(y是x取反)

口诀:与0清0,或1置1,异或1取反

4)按位取反 ------ ~

作用是将某个数的二进制位全部取反

~0xaf = 0x50 1010 1111 -------> 0101 0000

5)按位左移 ------ << 按位右移 --------- >>

移位操作将数字的所有二进制位当成一个整体水平左右移动

移位运算符属于双目运算符,左边是要移位的数据,右边就是要移位的位数

移位会导致移位数字的某些数位丢失,也会空出一些位置

移位的操作方法:

左移移出的高位丢弃,空出的低位补0 ------- 逻辑左移

无符号数据右移移出的低位丢弃,空出的高位补0 -------- 逻辑右移

有符号数据右移移出的低位丢弃,空出的高位补符号位 ------- 算数右移

8459ea77622b639748808c4f7bc00d51.png

移位操作演示

如果移位操作中没有丢失有效数据(移出的位中没有1),左移n位就相当于将数字乘以2的n次方,右移n位就相当于将数字除以2的n次方

(4)使用位运算构造一个任意的二进制数

有一个数字1111 1111,需要将第3-4位清0 --------> 1110 0111

unsigned char ch = 255; //使用按位与对某些位清0 ch & ~(0x3<<3) = 1110 0111 = 0xe7

有一个数字0000 0000,需要将第3-4位置1 --------> 0001 1000

unsigned char ch = 0; //使用按位与对某些位清0 ch | (0x3<<3) = 0001 1000 = 0x18

有一个数字1111 0000,需要将第3-4位取反 -------->1110 1000

unsigned char ch = 240; //使用按位与对某些位清0 ch ^ (0x3<<3) = 1110 1000 = 0xe8

思考:使用位运算,构造出一个0xaf的字符类型的值

先清0后置1

(4)复合赋值运算符

大多数的双目运算符,可以和赋值运算符组合形成新的复合赋值运算符

+= -= *= /= %= &= |= ^= >>== <<==

当希望把运算结果保存到某个参与运算的操作数时可以使用复合赋值运算符

a = a+b ---------> a += b a = a< a <<= b

复合赋值运算符的优先级和赋值运算符一样低。

(5)地址相关运算符

&是取地址运算符(单目),可以根据变量名获取变量的地址

int num; &num ----->变量的地址

C语言中使用%p占位符打印地址

*运算符(单目)可以根据地址获取该地址上的数据

(6)逗号运算符

逗号运算符作用用于合并两个表达式,运算时取后一个表达式的结果

逗号运算符的优先级低于赋值运算符

应用场景:

 1.连接表达式  2.声明多个同类型变量  3.for循环中作为分隔符

(7)三目运算符

三目(条件)运算符的作用是根据某个表达式的结果来选择执行的内容

格式:

 表达式 ? 公式1 : 公式2

如果表达式为真,执行公式1,否则执行公式2

练习:使用三目运算符,将用户输入的大写字母变为小写字母,输入的小写字母变成大写字母。

2.类型转换

(1)自动类型转换

如果一个表达式中包含多种类型的数据,C语言会将这些数据转换成同一种数据类型后再进行处理。

这个转换过程由计算机自动完成,所以叫自动类型转换(隐式类型转换)

转换规则:

1)如果不同数据类型所占空间不同,就会把占用空间小的类型转换成占用空间大的类型

2)如果不同数据类型所占空间相同,就把整数类型转换成浮点类型

3)如果不同数据类型所占空间相同,就把有符号转换成无符号

注意:在实际开发中不要使用自动类型转换,保证一个表达式中的数据类型相同

(2)强制类型转换

可以在C语言中任意给数据指定类型,这种方式就叫强制类型转换

语法:

(指定的类型)原数据

强制类型转换几乎不受任何规则约束,有可能造成数据丢失

强制类型转换的实现是计算机临时生成一个新的数据,并不会改变原有数据

新数据的值来自于原数据,类型由强转类型指定

3.运算符的优先级和结合性

优先级:当在一个表达式中出现多个不同优先级的运算符时,由优先级决定先运算还是后运算,优先级高的先运算,数字越小,优先级越高。

结合性:当在一个表达式中出现了相同优先级的运算符,就要按照结合性的顺序来进行运算,结合性分为左结合(从左到右)和右结合(从右到左)

num + num_1 + num_2 ------>从左到右 num = num_1 = num_2 ------>从右到左

运算符优先级和结合性表格

e49c07a76f2102a2a4dda6ac3e3eba92.png

运算符优先级和结合性表格(一)

a0d5e174dcd264a451f6ddbc02d381dd.png

运算符优先级和结合性表格(二)

4.C语言表达式的求值顺序

int num = 1;int num_1 = num++ + num;

(1)顺序点

C语言所有的运算都在表达式中完成,表达式本身完成以下两个内容

1)得到一个运算结果

2)产生副作用,所谓副作用就是会对表达式中的变量的值进行修改

++ -- =.....i++ ------->运算结果是i的值,副作用是将i+1 ++i ------->运算结果是i+1,副作用是将i+1

顺序点表示的是副作用必须产生效果的最后时间,副作用产生效果一定在顺序点之前。

..... i++.... 顺序点 .....

以num++ + num为例讨论顺序点对表达式求值的影响

如果在运算加法的时候副作用已经生效,那么表达式的运算结果为 2*num+1

如果在运算加法的时候副作用尚未生效,那么表达式的运算结果为 2*num

(2)C语言中规定的顺序点的位置

1)完整表达式结束

表达式语句结束

return语句

分支(if switch)和循环(for while)条件中

2)函数调用语句中,在是实参赋值完成和函数第一条语句执行之前

3)运算符 && || 逗号和? :的一个操作数获取之后

num++ + num在C语言中的运算结果是多少,答案是不确定

(3)C语言为什么不规定更多的顺序点来保证表达式确定的执行顺序

C/C++不规定很多的顺序点,求值顺序可能不确定,Java严格规定了求值顺序(从左到右)。C/C++这种做法是有意的,在编译器设计和优化的时候就可以根据实际需求去调整求值顺序,得到更高执行效率的代码。java规定了确定的求值顺序,在丧失了一定的效率获得了更加清晰地程序行为。一门编程语言是否规定求值顺序是由其各自设计原则来决定的。

结论:

在C/C++中,任何依赖于特定执行顺序,依赖顺序点之间实现副作用的表达式,其结果将得不到保证。

配套视频:深度解析C语言

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

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

相关文章

微软 PowerBI 被评为商业智能领导者-13年的企业产品奋斗史解读

恭喜微软连续 13 年被Gartner评为BI平台领导者。您可以插上耳机&#xff0c;打开音乐来一起欣赏这个过程。原文地址&#xff1a;https://powerbi.microsoft.com/zh-cn/blog/microsoft-named-a-leader-in-gartners-2020-magic-quadrant-for-analytics-and-bi-platforms/被评为第…

word List20

word List20 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

[python交互]Excel催化剂与python交互原理剖析,py开发者按此规范可自行扩展功能...

只需简单地编写小段py脚本&#xff0c;就可以借助Excel催化剂的平台作用&#xff0c;将写出的py脚本&#xff0c;嫁接到Excel的环境上使用&#xff0c;在Excel的广阔用户群体上带来更多的产出价值。也大大增加了将自己的python技能输出到普通用户可享用的层面。按照本文的规范&…

background图片不显示_一种解决Retina屏幕1px边框显示问题的方案

一、背景介绍&#xff1a;Retina是一种新型高分辨率的显示标准&#xff0c;是把更多的像素点压缩至一块屏幕里&#xff0c;从而达到更高的分辨率并提高屏幕显示的细腻程度&#xff1b;同时CSS样式表中px单位是一个相对值&#xff0c;并不是绝对值&#xff0c;实际在Retina屏幕中…

gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型

当你第一次定义Protocol Buffer的消息的时候&#xff0c;你肯定会给消息设定一套规则需求。但是随着时间的推进&#xff0c;你的业务可能会发生了变化&#xff0c;与此同时&#xff0c;你的Protocol Buffer消息类型的需求也会随之变化。也就是说&#xff1a;有一些字段可能会发…

opengl如何画出一个球_少儿美术绘画教程:毛线球

小朋友们&#xff0c;你们平时画画有没有遇到过没有灵感的时候&#xff0c;面对画纸却不知道画些什么呢&#xff1f;今天我们来介绍一种创意思维&#xff0c;叫发散性思维。以一个毛线球为出发点。通过毛线球&#xff0c;我们可以想到圆球&#xff0c;通过圆球我们可以想到圆形…

数据结构---后序和中序遍历的二叉树序列还原二叉树

数据结构—后序和中序遍历的二叉树序列还原二叉树 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {char data;struct bstTree* lchild, *rchild; }bstTree; bstTree * reStoreTree(char* pre, int preSt, int preEnd, char *mi…

Asp.Net Core 混合全球化与本地化支持

前言最近的新型冠状病毒流行让很多人主动在家隔离&#xff0c;希望疫情能快点消退。武汉加油&#xff0c;中国必胜&#xff01;Asp.Net Core 提供了内置的网站国际化&#xff08;全球化与本地化&#xff09;支持&#xff0c;微软还内置了基于 resx 资源字符串的国际化服务组件。…

最大连续子数组和 动态规划_剑指Offer算法题 33:连续子数组的最大和

题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢&#xf…

数据结构---顺序查找和二分查找

数据结构—顺序查找和二分查找 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> int n;//查找元素数组的长度 void seqCheckValue1(int* a) {//顺序查找1,有越界判断int v a[0];for (int i 1; i < n; i) {if(a[i…

git上托管的代码如何部署在阿里云上_居然仅用浏览器搞定Spring Boot应用的开发与部署...

最近有幸试用了一下阿里云的一个新产品&#xff1a;云开发平台&#xff0c;体验一把全新的开发模式&#xff01;虽然中间也碰到了一些问题&#xff0c;但整体的体验透露着未来感&#xff0c;因为整个过程都不需要使用我们最常用的IDEA&#xff0c;仅依靠浏览器就把一个Spring B…

Kubernetes 与 Helm:使用同一个 Chart 部署多个应用

k8s 集群搭建好了&#xff0c;准备将 docker swarm 上的应用都迁移到 k8s 上&#xff0c;但需要一个一个应用写 yaml 配置文件&#xff0c;不仅要编写 deployment.yaml 还要编写 service.yaml &#xff0c;而很多应用的配置是差不多的&#xff0c;这个繁琐工作让人有些望而却步…

数据结构---BF字符串模式匹配

数据结构—BF字符串模式匹配 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> int BF(char * S, char* T,int pos,int n,int m) {//暴力算法求解子串T在S中第一次出现的位置int i pos, j 0;while (i < n &&a…

windows系统如何cmake_Windows操作系统如何快速增加分区?建议收藏

现在新买的电脑大都是出厂单分区的设置&#xff0c;也就是只有系盘C&#xff0c;没有D、E之类。于是也问过厂商的工作人员&#xff0c;得到的答复是恢复备份的机制已经十分完善&#xff0c;保证用户使用安全毫无问题。不过&#xff0c;相信小伙伴们和我一样&#xff0c;内心还是…

大白技术控 | Windows10X 模拟器简单上手体验

点击蓝字“大白技术控”关注我哟加个“星标★”&#xff0c;每日 19:30&#xff0c;好文必达&#xff01;前言Windows10X 和 Windows10 有什么区别&#xff1f;当这个问题摆在我面前的时候&#xff0c;我就脱口而出&#xff1a;区别&#xff1f;双屏了呗&#xff01;这个答案有…

word List 21

word List 21 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

Asp.Net Core Identity 骚断腿的究极魔改实体类

前言默认的 Identity 实体类型在大多数时候已经基本够用&#xff0c;很多时候也只是稍微在 IdentityUser 类中增加一些自定义数据字段&#xff0c;比如头像。这次&#xff0c;我要向园友隆重介绍我魔改之后的 Identity 实体类&#xff0c;能支持一些特别风骚的操作。当然也完全…

[蓝桥杯2015决赛]四阶幻方

题目描述 把1~16的数字填入4x4的方格中&#xff0c;使得行、列以及两个对角线的和都相等&#xff0c;满足这样的特征时称为&#xff1a;四阶幻方。 四阶幻方可能有很多方案。如果固定左上角为1&#xff0c;请计算一共有多少种方案。 比如&#xff1a; 1 2 15 16 12 14 3 5 13 7…

数据结构---模式匹配

数据结构—模式匹配 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 int next[N]; void getNext(char *T,int *next,int m) {//求解当前字符前面的最大公共前缀和后缀int j 1,k0;next[j] 0;//从1开始…

CKEditor 4编辑器已与Vue.js集成

虽然 CKEditor 4 不是目前主要维护的分支&#xff0c;不过官方并没有让它落后于潮流。近日&#xff0c;CKEditor 团队发布了与 Vue.js 框架原生集成的 CKEditor 4。这就意味着&#xff0c;开发者可以通过<ckeditor />标签以 Vue.js 组件的形式使用 CKEditor 4 &#xff0…