操作符详解(上篇)
前言
小伙伴们大家好,随着对c的不断学习今天我们将来学习操作符。在初始c语言中也介绍过操作符但也只是点到即可,今天我们将详细了解操作符。
操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下表引用,函数调用和结构成员
算术操作符
算术操作符都有哪些呢?让我们一起来看看吧。算术操作符包括:+ - * / %.在数学中乘号是X,但是在c语言中乘号是用*来表示的。同样的还有除号,也与数学中的写法不一样。同时还要注意的两个点,第一当除号两端都是整数时执行的是整数除法结果也是整数;除号有一端是小数时执行小数除法,所得的结果也是小数的形式。


第二个值得注意的点就是%,%是取模也被称之为取余。%的两端只能是整数不能是小数

当%的两端有一端是小数时,编译器会报错并提示有小数的一端非法

位移操作符
操作符移动的是二进制位,此时不得不先提整数的二进制表示形式。以int a = -3为例,int 是4个字节一个字节是八个比特位,所以此时a的二进制位有32位10000000000000000000000000000000011。整数的二进制表示形式有三种:原码,反码,补码。还是以a为例,此时a的原码为10000000000000000000000000000000011。反码:最高位不变,其余位进行按位取反,此时a的反码为11111111111111111111111111111100,。补码:在反码的基础上进行加1,此时a的补码为11111111111111111111111111111101.需要注意的是,正整数的原码反码补码都是一样的,而负整数的原码反码补码需要进行计算得出。可能有小伙伴要问了为啥我们非得要补码呢?原码不可以直接用吗?我们要求补码,是因为整数在内存中的存储是以补码的形式。
左移操作符<<
左移操作符移的是二进制的是二进制位

a的二进制位是000000000000000000000000000000011,把a的二进制位向左移一格,舍弃左边,右边补0,此时我们会得到b的二进制位000000000000000000000000000000110,b的值为6.上代码

简单归纳,左移操作符的使用方法是舍弃左边,右边补0.
右移操作符>>
左移操作符移的是二进制位,同样右移操作符移的也是二进制位。不过右移操作符分为两种:一种是逻辑右移,另一种是算术右移。逻辑右移:右边丢弃,左边直接用0填充。算术右移:右边丢弃,左边原来的符号位填充。在代码中是使用算术右移还是逻辑右移,这是由编译器决定的。不过一般都是使用算术右移。

从这里可以看出实现的是算术右移。那我们来分析一下倘若进行逻辑右移时又会有什么不同呢?让我们一起来看看吧。a=-3,其二进制位原码为10000000000000000000000000000011,反码:最高位不变,其余位进行按位取反得到11111111111111111111111111111100,补码:在反码的基础上加一得到11111111111111111111111111111101。当a按照算术右移来移动已为时,右边丢弃左边直接补0得到补码为:01111111111111111111111111111110 。补码减一取反得到原码:00000000000000000000000000000010此时得到a>>1的值为2.
不管是左移操作符还是右移操作符移动的都是整数,一定不能是小数。同时移动整数时一般移动的都是正整数。直接上代码来看看效果吧。当a左移的是一个负数时编译器会发出警告,同时运行结果是一个负数


这里我们需要注意,位移操作符移动的是整数且是正整数
位操作符
位操作符的分类:按位与&,按位或|,按位异或^。不管是按位与还是按位或还是按位异或中的位都是二进制位
按位与&
按位与简单来说就是,有0则0.用代码来理解吧

按位或|
按位或简单来说:有1则为1.依旧是用代码来理解吧

按位异或^
按位异或的使用方法:相同为0相异为1.依旧是用代码理解

来利用按位异或的知识来写一道题吧。题目要求为不使用临时变量来交换两个变量的值。
在之前的学习中交换两个变量的值我们会通过使用临时变量。但这题的要求是不使用临时变量。第一种解决方法
#include<stdio.h>
int main()
{int a = 3;int b = 5;printf("a=%d b=%d\n", a, b);a = a + b;//a=8b = a - b;//b=8-3=5;a = a - b;//a=8-5=3;printf("a=%d b=%d\n", a, b);return 0;
}

此时达到了交换变量值的目的,但是这种代码存在问题。当a和b的值非常大时,a+b的结果容易溢出。这种方法还是不太好。
第二种方法利用按位异或来进行解决
#include<stdio.h>
int main()
{int a = 3;int b = 5;printf("a=%d b=%d\n", a, b);a = a ^ b;b = a ^ b;a = a ^ b;printf("a=%d b=%d\n", a, b);return 0;
}

利用按位异或,可以达到交换变量的效果。那可能又有小伙伴要问了,为啥会这样呢?接下来就让我们一起来分析分析吧
a的二进制位00000000000000000000000000000011
b的二进制位00000000000000000000000000000101
第一次按位异或得到a的值,这个值作为交换变量值的桥梁
a^b的结果为:00000000000000000000000000000110,a=a^b,此时a的值为6
再进行按位异或得到b的值
b=a^b::00000000000000000000000000000011 ,b的值为3
最后进行一次按位异或得到a的值
a=a^b:00000000000000000000000000000101,a的值为5.
赋值操作符
赋值操作符=,这里要注意区别与==。=是赋值操作符,==是判断相等。赋值操作符可以改变变量之前的值
double salary = 10000.0;salary = 20000.0//使用赋值操作符进行赋值int weight = 110;weight = 90;//对体重不满意就可以赋值
复合赋值
+= : a= a+b;可以改成a+=b;
-= : a=a-b可以改成a -= b;
/=: a=a/b可以改为a/=b
%=: a=a%b可以改为a%=b;
>>=: a=a>>1改为a>>=1
<<+: a=a<<=1改为a<<=1
&= : a=a&b改为a&=b;
|= : a=a|b改为a|=b;
^=: a=a^b改为a^=b;
单目操作符
单目操作符的分类
!逻辑反操作符,++自增操作符,--自减操作符,&取地址操作符,*解引用操作符,~对一个二进制位进行按位取反,+正值,-负值,sizeof操作数类型大小(单位为字节),(类型)强制类型转化
!逻辑反操作符
!逻辑反操作符,例如a=1为真是,那么!a为假。倘若b=0时为假,那么!b为真
++自增操作符
++自增操作符分为前置++和后置++。前置++先加加再使用;后置加加,先使用再加加。直接上代码来康康它们的区别吧
int main()
{int a = 10;int b = a++;printf("a=%d,b=%d ", a, b);//a=11,b=10return 0;
}

int main()
{int a = 10;int b = ++a;printf("a=%d,b=%d ", a, b);//a=11,b=11return 0;
}

--自减操作符
--自减操作符也分为前置--和后置--.前置减减先减减再使用;后置减减,先使用再减减。上代码
int main()
{int a = 10;int b = --a;printf("a=%d,b=%d ", a, b);//a=9,b=9return 0;
}

int main()
{int a = 10;int b = a--;printf("a=%d,b=%d ", a, b);//b=10,a=9return 0;
}

&取地址操作符
&取地址操作符可以取出变量或者数组的地址,然后把地址放在指针变量中存储起来。
int main()
{int a = 10;int * pa = &a;printf("%p ", pa);return 0;
}
此时可以通过pa找到a的地址

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };printf("%p ", &arr);return 0;
}

*解引用操作符
解引用操作符通常和取地址操作符搭配使用
int main()
{int a = 10;int* pa = &a;*pa = 20;printf("%d ", a);return 0;
}

把a的地址放在指针变量pa中,再通过解引用操作符对pa进行解引用操作。*pa就相当于是a
~对二进制位进行按位取反
直接上代码来康康吧
int main()
{int a = -3;//原码:10000000000000000000000000000011;//反码:11111111111111111111111111111100//补码:11111111111111111111111111111101a = ~a; //~a;000000000000000000000000000000010printf("%d ", a);return 0;
}
sizeof操作数类型的大小
sizeof用来计算所占空间大小单位为字节,不但可以计算变量的大小还可以计算数组大小。让我们一起来看看代码吧
int main()
{int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof(int));int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };printf("%d\n", sizeof(arr));printf("%d\n", sizeof(int[10]));return 0;
}

(类型)强制类型转化操作符

这种出现了一个警告,从double转化到int 可能丢失数据。此时有两种解决办法:第一种将int a 改为double a.把a的类型改为浮点型。第二种方法在10.0/3之前放一个(int)将结果转化为整形


以上就是操作符详解的上篇,欲知下事如何请听下回分解。操作符详解下篇正在准备中。
创作不易还望各位大佬们点赞,么么哒

相关文章:

操作符详解(上篇)
前言小伙伴们大家好,随着对c的不断学习今天我们将来学习操作符。在初始c语言中也介绍过操作符但也只是点到即可,今天我们将详细了解操作符。操作符分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号…...

采样电路的3个组成部分
采样电路的使用实际上是电路的一个闭环控制过程,也可以理解为一个负反馈过程,采集的信号被传送到主控制芯片进行调整。今天就来为您介绍一下采样电路的三个组成部分分析!一起来看看吧! 这里的采样实际上分为电流采样、电压采样、…...

ffmpeg硬解码与软解码的压测对比
文章目录ffmpeg硬解码与软解码的压测一、基本知识二、压测实验1. 实验条件及工具说明2. 压测脚本3. 实验数据结果ffmpeg硬解码与软解码的压测 一、基本知识 本文基于intel集显进行压测 软解码:cpu对视频进行解码硬解码:显卡或者多媒体处理芯片对视频进…...

操作符——“C”
各位CSDN的uu们你们好呀,今天,总算是要到我们的操作符啦,在C语言中,操作符是一个极为复杂的东西,下面,就让我们进入操作符的世界吧 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符…...
YSP的UI界面设计
文章目录一、准备工作二、UI设计1.QPushButton:三、遇到的bug一、准备工作 1.MSVC和MinGW上编译的项目,不能用另一个编译器进行编译 2.若要使用MSVC编译器,需要下载对应版本的VS 见此篇:https://blog.csdn.net/Copperxcx/article…...

干货 | 什么是磁传感器?最常用的磁传感器类型及应用
1、什么是磁传感器?磁传感器通常是指将磁场的大小和变化转换成电信号。磁场,以地球磁场(地磁)或磁石为例的磁场是我们熟悉但不可见的现象。将不可见的磁场转化为电信号,以及转化为可见效应的磁传感器一直以来都是研究的主题。从几十年前使用电…...
操作符(运算符)详解
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰算数操作符: - * / % 🐰移位操作符&#x…...

【LeetCode每日一题】【2023/2/9】1797. 设计一个验证系统
文章目录1797. 设计一个验证系统方法1:哈希表代码总体1797. 设计一个验证系统 LeetCode: 1797. 设计一个验证系统 中等\color{#FFB800}{中等}中等 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在…...

计算机图形学:改进的中点BH算法
作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、改进缘由二、…...
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
系列文章目录 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…...

十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【含音视频通话】
这篇文章无废话,只教你如果接到即时通讯功能需求,十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【包含音视频通话功能】。 写这篇文章是因为,结合自身情况,以及所遇到的有同样情况的开发者在接到即时通讯&a…...

pandas——DataFrame基本操作(二)【建议收藏】
pandas——DataFrame基本操作(二) 文章目录pandas——DataFrame基本操作(二)一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.修改数据2.缺失值3.合并1.concat合并2.使用append方法合并3.使用merge进行合并4.使用…...

PostgreSQL查询引擎——General Expressions Grammar之restricted expression
General expressions语法规则定义在src/backend/parser/gram.y文件中,其是表达式语法的核心。有两种表达式类型:a_expr是不受限制的类型,b_expr是必须在某些地方使用的子集,以避免移位/减少冲突。例如,我们不能将BETWE…...

从某种程度上来看,产业互联网是一次对于互联网的弥补和修正
如果对当下我们正在经历的这样一个时代进行一次定义的话,我更加愿意将其划归到产业互联网的范畴里。可能有人会说,这与产业互联网并无联系,因为从本质上来看,当下我们所经历的这样一个时代,其实是与互联网并没有太多联…...
【C#Unity题】1.委托和事件在使用上的区别是什么?2.C#中 == 和 Equals 的区别是什么?
1.委托和事件在使用上的区别是什么? 委托和事件是C#中的重要概念,通俗来讲,委托是一个可以指向特定方法的指针,可以将委托分配给不同的脚本,使它们能够完成不同的任务。而事件则是一种使用委托实现的通知机制ÿ…...

FFmpeg5.0源码阅读——内存池AVBufferPool
摘要:FFmpeg中大多数数据存储比如AVFrame,AVPacket都是通过AVBufferRef管理的,而承载数据的结构为AVBuffer。本文主要通过FFmpeg源码来分析下FFmpeg中AVBuffer相关的实现。 关键字:AVBuffer、AVBufferPool、AVBufferPool 1. AVBufferRef 1.…...

Python学习------起步7(字符串的连接、删除、修改、查询与统计、类型判断及字符串字母大小写转换)
目录 前言: 1.字符串的连接 join() 函数 2.字符串的删除&取代 replace()函数 3.字符串的修改&切割 (1)strip() 函数 (2)lstrip()函数 和 rstrip()函数 (3)split()函数-->…...

雪花算法snowflake
snowflake中文的意思是 雪花,雪片,所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求,得益于twitter内部高超的技术,雪…...

Part 4 描述性统计分析(占比 10%)——上
文章目录【后续会持续更新CDA Level I&II备考相关内容,敬请期待】【考试大纲】【考试内容】【备考资料】1、统计基本概念1.1、统计学的含义及应用1.1.1、统计学的含义1.2.1、统计学的应用1.2、统计学的基本概念1.2.1、数据及数据的分类1.2.2、总体和样本1.2.3、…...

Linux系统安全:安全技术和防火墙
目录 一、安全技术 1、安全技术 2、防火墙分类 二、防火墙 1、iptables五表五链 2、黑白名单 3、iptables基本语法 4、iptables选项 5、控制类型 6、隐藏扩展模块 7、显示扩展模块 8、iptables规则保存 9、自定义链使用 一、安全技术 1、安全技术 ①入侵检测系统…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...