C语言操作符详细讲解
前言
本次博客一定会让刚刚学习C语言小白有所收获
本次操作符讲解不仅分类还会有代码示例
好好看 好好学 花上几分钟就可以避免许多坑
1 操作符的基本使用
1.1操作符的分类
按功能分
算术操作符: + 、- 、* 、/ 、%
移位操作符: >> <<
位操作符: & | ^
赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>>= 、&= 、|= 、^=
单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof(类型)
关系操作符: > 、>= 、< 、<= 、 == 、 !=
逻辑操作符: && 、||
(三目操作符)条件操作符: ? :
逗号表达式: ,
下标引⽤: []
函数调⽤: ()
按性质分为 单目操作符 双目操作符 三目操作符
主要的区分是 单目为一个操作数 双目为两个操作数 三目操作符为三个操作数
1.2操作符的使用
1.21算术操作符
对于算术操作符来说,值得注意的点只有 / %
对于加减乘 任何数据都能实现,但是 除法
在遇到整数时,首先除数不能为0,其次除不尽是只会保留整数
比如 2 /1=2 1/2=0 5/3=1
当然如果是浮点数会保留的 1/2.0=0.5
如果是%(求模) 注意它只服务于整型数据取得的数为余数
大家看看代码呗
是不是 % 只能对整数有效
让大家看看结果
10/3只能保留3 10%3余下一个1
这里没有讲解 加减乘 大家可以自行操作,就是数学中的普通四则运算
1.22移位操作符
>> <<
移位操作符的操作数只能是整数
<< 左移操作符
移位规则:左边抛弃、右边补0
我们举两个例子来说明情况
注意整型在内存中的存储为补码,我们分别以 -1 与+1来进行左移操作
这是对一的左移
先画图
画的一般,但是能看
继续看-1的左移
我们看看代码
此时a 和 b的大小都变为2倍
>>右移操作符
位规则:⾸先右移运算分两种:
1. 逻辑右移:左边⽤0填充,右边丢弃
2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
我们的编译器一般都是算术右移
直接看代码
#inlcude<stdio.h>
int main()
{int a = 2;int b = -2;printf("%d", a >> 1);printf(" %d", b >> 1);return 0;
}
看结果
所以左移操作符的作用是 在不溢出的情况下,使原有的数*2
右移操作符的作用是 在不溢出的情况下,使原有的数/2
1.23位操作符
& 按位与 | 按位或 ^ 按位异或 ~按位取反
位操作 这里只讲简单的原理即可
1& 按位与
画图吧
2 | 按位或
看图
3^ 按位异或
看图
4按位取反
看图
注意一下再char类型中是如此 它的范围为 -128~127
而short类型的 它的范围为-32768~32767
我们可以看看 它的-32768的原码为
1000 0000 0000 0000
值得注意的是它的补码也是 1000 0000 0000
ok 上述代码都可以通过代码实现
是不是对应上了
1.24赋值操作符:
= 、+= 、 -= 、 *= 、 /= 、%= 、>>= 、&= 、|= 、^=
其实这个没什么可讲的,就是赋值
看代码
int main()
{char a = 1;char b = 126;a = 28;//把28赋值给aa += 10;//a=a+10a -= 10;//a=a-10;a *= 10;//a=a*10;a /= 10;//a=a/10;a %= 10;//a=a%10;a >>= 10;//a=a>>10;a &= 1;//a=a&1;return 0;
}
1.25单⽬操作符
++ -- ! & sizeof()
前置++ --
是先++ --后使用
后置 ++ --
是先使用后++ --
!是使非0的值变为0 使0变为1
简单举例子就好
int main()
{int a = 0;int b = 1;int c = 1;if (++a)printf("++a是先加1在使用进入判断哦\n");if (!--b)printf("--b是先减去1在进入判断哦\n");if (c--)printf("c--是先使用才会减1哦\n");return 0;
}
看结果
& sizeof()
&作为单目操作符为去某个数据的地址与 双目操作符&按位与是不同的含义
sizeof()是计算某个数据所占的内存大小
看代码
int main()
{int a = 10;int* p = &a;*p = 20;//改变a的值int b = sizeof(p);//计算指针类型的大小int c = sizeof(b);//计算int类型的大小printf("%d %d %d ", a, b, c);return 0;
}
1.26关系操作符:
> 、>= 、< 、<= 、 == 、 !=
这其实更没有必要讲解l
其实就是数学里的比大小,如果成立返回1,不成立返回0
!=为不等于
看代码
所以懂了吗
1.27逻辑操作符
&& 、||
逻辑操作符也是一个很重要的操作符
&&逻辑与 (表达式1)&&(表达式2) 只有两个都为真时 整个式子才为真
||逻辑或 (表达式1)||(表达式2)只要一个为真时 整个式子就为真
给一个最简单的代码吧
int main()
{int a = 0 && 0;int b = 1 && 1;int c = 1 && 0;int a1 = 0 || 0;int b1 = 1 || 1;int c1 = 1 || 0;printf("%d %d %d",a,b,c);printf("%d %d %d", a1, b1, c1);return 0;
}
看结果
当然有注意点的
1两端其实可以是表达式的
2对于(表达式1)&&(表达式2)只要 表达式1为假 那么表达式二直接不运算,整个式子的值为0
3对于(表达式1)||(表达式2)只要 表达式1为真 那么表达式而同样不计算 ,整个式子的值就为1
1.28(三目操作符)条件操作符
(表达式1)? (表达式2):(表达式3)
如果表达式1为真则执行表达式1否者执行表达式2
很简单
看代码
int main()
{int a = 10;int b = 20;//三目操作符int c = 10 > 20 ? 10 - 20 : 10 + 20;int d = a>10?10:20;//注意后面的表达式只能是一个确切的值,不能是一个赋值表达式//a > b ? a + 20 : b =30;//errorprintf("%d %d %d %d", a, b, c, d);//还有一种用途,可以用在打印里头 条件打印printf(a > b ? "*" : "1");return 0;
}
1.29逗号表达式:
是从左到右依次执行代码,取最后一个表达式的值为返回值 看语法
(表达式1,表达式2,表达式3,表达式4,表达式5,表达式6······,表达式n)
, 只是一个小小的逗号可能还看不出什么,我们还是看代码说话
int main()
{int a = 10;int b = 20;int c = 30;int d = (a = 30, b++, c += 60, 20);//那么此时 a为30 b为21 c为90 d取上最后一个表达式的值为20//看结果printf("%d %d %d %d", a, b, c, d);return 0;
}
1.30下标引用 函数调⽤
[] ()
下标引用 主要用于数组中调用任意位置中的元素
当然他也可以对指针使用等效于 a[0]==*(a+0)
函数调用符号更没什么好讲了,用于函数的调用以及定义
还是举例看代码就好
void haha(int a,int b);//这是函数声明,用了 ()
int main()
{
int a=20;
int *p=&a;
int c=p[0];//算是解引用的一种
int arr[20]={0};//对数组的定义
return 0;
}
至此几乎所有的操作符的基本使用都讲解完了接下来看看优先级以及结合性
1.3操作符的属性
分为优先级、结合性
先上一张图
1.31优先级结合性
优先级 优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的
比如
3 + 4 * 5;
上⾯示例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法 的优先级高于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4
结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符( = )
5 * 6 / 2;
上⾯⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 , 再计算 6 / 2
运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议⼤概 记住这些操作符的优先级就⾏,其他操作符在使⽤的时候查看下⾯表格就可以了
我们可以列出几个优先级问题的代码,一般而言优先级不需要特殊记忆,只要多敲多练即可
看看代码
int main()
{int a = 10;//看看,如果我们要让a先左移两位再按位与上一个1,就必须要加上括号//否则此时是先2与1逻辑与再左移int d =(a<<2)&1;return 0;
}
//这个很容易搞错,大家以后会遇到这样的代码
再看一个例子
int main()
{int arr[20] = {0};int** parr = &arr;//不加上括号的话编译器无法知道 是先执行 * 还是[] 所以要加上()(*parr)[10] = 1;return 0;
}
这类例子还有很多,基本上都是解引用的优先级一样不知道先使用那个解应用
对于结合性只需记忆一个点
1 赋值操作符都是从右往左
2三目操作符从右往左
3其他基本都是从左往右
总结
大家还是要多练,才能有理解,祝大家开心
相关文章:

C语言操作符详细讲解
前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符: 、- 、* 、/ 、% 移位操作符: >> << 位操作符…...

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!
文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场,国际化是肯定…...

服务器大请求体问题定位
背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...

Vue指令之v-model
调了半天没反应,结果是没引用Vue,我是伞兵。 v-model的作用是将视图与数据双向绑定。一般情况下,Vue是数据驱动的,即数据发生改变后网页就会刷新一次,更改对应的网页内容,即数据单向绑定了网页内容。而使用…...

信息系统项目管理师——第11章项目成本管理(重要)
选择、本章节内容属于10大管理知识领域中的重中之重案例、论文都会考,需要完全掌握。 选择题大概考3分左右,理论和计算都会考。 案例题,必考内容,挣值相关的计算,必须得会。 论文题,考的比较多,…...

SpringMVC常见面试题
1:Spring mvc执行流程 回答: 版本1:视图版本,jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器,生成处理器对象及处理器拦…...

golang 和java对比
Golang(又称Go)和Java都是目前非常流行的编程语言,但它们有着不同的设计哲学和用途。在本文中,我们将对Golang和Java进行比较,从以下几个方面进行评估:语言特性、性能、并发性能、生态系统和使用场景。 一…...

基于pear-admin-flask 的 flask 使用教程
我最近接触到了一个极为出色的Flask后台库——pear-admin-flask,这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...

Android 开发投屏软件
一、背景 作为Android开发总会有给他人share自己APP情况,一般在线会议投屏,总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力,可以在电脑端直接控制手机,同步起来非常方便简单 打开步骤 …...

.Net Web窗口页属性
<%Page %> Page 指令定义 Web 窗体使用的属性,这些属性将被 Web 窗体页分析器和编译器使用。只能包含在 .aspx 文件中。我们每新建一个 Web 页面时,系统会自动为该 Web 页面头部创建一个 Page 指令,来指明页面最基本的属性。 Langu…...

渐变色x轴换行柱状图
// 系统上云率const optionBar {title: {text: 系统上云率,left: left,textStyle: {color: "#fff",fontSize: 14,fontWeight: 650,align: "center",},},color: [#32C5FF, #00F766, #EECB5F],grid: {top: 40,bottom: 0,},legend: { // 控制图例组件show: …...

源支付V7开源版2.99,修复各种提示错误
源支付V7开源版2.99,修复各种提示错误 加密说明:200拿来的,只有8.1这个文件加密,其他文件无任何加密,已修复各种提示错误 测试其他开源版安装提示错误,有几个文件是加密的 注:开发不易&#…...

Mysql中的那些锁
表锁和行锁 表锁:一锁锁整张表,mysql中锁定颗粒度最大的一种,针对非索引字段加的锁。MyISAM和InnoDb都支持。 行锁:一锁只锁整行,锁定颗粒度最小,针对索引字段加的锁。MyISAM不支持,InnoDb支持…...

如何在Linux系统部署ONLYOFFICE协作办公利器并实现多人实时编辑文档
文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...

Linux部署Sonarqube+Gogs+Jenkins(一)
Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录,并且进行解压3. 配置文件/etc/profile,配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…...

程序员开发技术整理(持续整理中)
前端技术: vue-前端框架element-前端框架bootstrap-前端框架echarts-图标组件 C#后端技术: webservice:soap架构:简单的通信协议,用于服务通信ORM框架:对象关系映射,如EF:对象实体…...

Java并查集详解(附Leetcode 547.省份数量讲解)
一、并查集概念 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,…...

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)
前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…...

更新一条SQL的执行流程
在 MySQL中,条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句,并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后,先进行语法…...

深入理解nginx mp4流媒体模块[上]
目录 1. 引言2. 配置3. 源码分析3.1 配置指令3.1.1 mp43.1.2 mp4_buffer_size3.1.3 mp4_max_buffer_size3.1.4 mp4_start_key_frame 3.2 MP4的请求处理过程3.2.1 预处理3.2.2 找到并打开本地mp4文件3.2.3 解析请求参数3.2.4 MP4文件的处理 深入理解nginx mp4流媒体模块[上] 深入…...

Go 之 Gin 框架
Gin 是一个 Go (Golang) 编写的轻量级 web 框架,运行速度非常快,擅长 Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用 Gin,特别适合微服务框架。 简单路由配置 package mai…...

vue3+threejs新手从零开发卡牌游戏(二十一):添加战斗与生命值关联逻辑
首先将双方玩家的HP存入store中,stores/common.ts代码如下: import { ref, computed } from vue import { defineStore } from piniaexport const useCommonStore defineStore(common, () > {const _font ref() // 字体const p1HP ref(4000) // 己…...

Linux内核err.h文件分析
在阅读和编写内核相关的代码时,经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例,内核版本为5.15。 这个文件的代码如下: /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…...

Qt 富文本处理 (字体颜色大小加粗等)
Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口:setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 ,主要使用QTextCharFormat类进行文本样式设置。 示例: QTextCharFormat fmt; //粗体 fmt.setFontWeight…...

消息队列的七种经典应用场景
在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享…...

uniapp 微信小程序 canvas 手写板文字重复倾斜水印
核心逻辑 先将坐标系中心点通过ctx.translate(canvasw / 2, canvash / 2) 平移到canvas 中心,再旋转设置水印 假如不 translate 直接旋转,则此时的旋转中心为左上角原点,此时旋转示意如图所示 当translate到中心点之后再旋转,此…...

JavaScript如何制作轮播图
在JavaScript中实现轮播图可以通过多种方式,但最常见的方式是使用数组来存储图片,然后使用setInterval函数定期更改显示的图片。下面是一个简单的例子: 首先,你需要在HTML中设置一些用于显示图片的<img>标签,以…...

【面试经典150 | 动态规划】零钱兑换
文章目录 Tag题目来源解题思路方法一:动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一:动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i,如果当前…...

什么是防火墙,部署防火墙有什么好处?
与我们的房屋没有围墙或界限墙一样,没有防护措施的计算机和网络将容易受到黑客的入侵,这将使我们的网络处于巨大的风险之中。因此,就像围墙保护我们的房屋一样,虚拟墙也可以保护和安全我们的设备,使入侵者无法轻易进入…...

学习鸿蒙基础(10)
目录 一、轮播组件 Swiper 二、列表-List 1、简单的List 2、嵌套的List 三、Tabs容器组件 1、系统自带tabs案例 2、自定义导航栏: 一、轮播组件 Swiper Entry Component struct PageSwiper {State message: string Hello Worldprivate SwCon: SwiperControl…...