C语言操作符(上)

发布时间:2026/7/24 22:52:19

C语言操作符(上)
文章目录一、操作符的含义二、操作符的分类三、运算符功能介绍1. 算术操作符2. 关系操作符3. 逻辑操作符**▲ 逻辑操作符的短路现象**4. (复合)赋值操作符5. 单目操作符6. 条件操作符7. 逗号表达式8.下标引用操作符9.函数调用操作符10.结构成员访问操作符一、操作符的含义操作符(Operator)是一种告诉编译器执行特定的数学或逻辑操作的符号。操作符又称为运算符作为运算对象的变量或者常量称为操作数。操作符左边的操作数称为第一操作数或者左操作数操作符右边的操作数称为第二操作数或者右操作数。操作符同时对两个操作数进行运算的称为双目操作符操作符只对一个操作数进行运算的称为单目操作符。二、操作符的分类●算术操作符、-、*、/、%●移位操作符、●位操作符:、|、^●赋值操作符、、-、*、/、%、、、、|、^●单目操作符!、、- -、、*、、-、~、sizeof、(类型)●关系操作符、、、、、!●逻辑操作符、||●条件操作符? :●逗号表达式,●下标引用操作符[ ]●函数调用操作符( )●结构成员访问操作符.、-三、运算符功能介绍1. 算术操作符(1) (加法运算符)实现两个操作数的加法运算是一个双目操作符。例如inta2;intb3;intcab;//实现两个整型变量的加法运算printf(%d\n,c);//结果为5printf(%d\n,a6);//变量和常量相加结果为8printf(%d\n,34);//常量和常量相加结果为7当只有一个右操作数的时候就是正号它就是一个单目操作符。intn10;printf(%d\n,n);//结果为10同样的 -(减法操作符)实现两个操作数的减法运算。当 - 只有一个右操作数的时候它就是负号就是一个单目操作符。(2) *(乘法操作符)实现两个操作数的乘法运算。键盘上通过shift8键敲出来。*是一个双目操作符。inta3;intb7;printf(%d\n,a*b);//结果为21/(除法操作符)实现两个操作数的除法运算。是一个双目操作符。printf(%d\n,10/5);//打印结果为2printf(%d\n,5/2);//打印结果为2printf(%lf\n,3.0/2);//打印结果为1.500000printf(%lf\n,3.0/2.0);//打印结果为1.500000注意在做两个操作数的除法运算时当/(除号)两边都是整型类型的操作数时则得到的结果只会是整型。比如上面的第二行5/2的结果本应该是2.5但是只会保留整数部分的2而舍弃小数部分。所以以%d的形式打印出的结果就为2。当/(除号)两边至少有一个是浮点数类型的操作数时则就会计算出小数的结果。比如上面的3.0/2、3.0/2.0得到的结果就都是1.5以%lf的形式打印会在屏幕上打印出1.500000(注意以%lf的形式打印小数点后默认会打印出6位)(3) %(取余(模)操作符)用于求两个整型相除以后的余数是一个双目操作符。%运算符要求两个操作数必须是整数计算得到的余数也是整数。printf(%d\n,7%2);//打印结果为1printf(%d\n,14%3);//打印结果为2printf(%d\n,3%5);//打印结果为3注意当被除数小于除数时得到的余数就是被除数。2. 关系操作符关系操作符都是双目操作符。特别多的会用在分支语句或循环语句的条件部分。intage10;if(age18)printf(成年了\n);elseprintf(未成年\n);运行结果charch[10]abcdefg;inti0;while(ch[i]!\0){printf(%c ,ch[i]);ii1;}运行结果上面只举了两个例子其实对于关系操作符很简单。这里只是做简单的介绍(大于)、(大于等于)、(小于)、(小于等于)、(等于)、!(不等于)。(注意在判断是否是等于关系时两个等号才是判断相等而一个等号是赋值。不要混淆)对于关系运算的结果只有0和1两种结果0表示假1表示真。printf(%d\n,32);//打印结果是1printf(%d\n,3!3);//打印结果是0在C语言中非0表示真0表示假。3. 逻辑操作符(1) 逻辑与操作符双目操作符。顾名思义就是并且的意思形式是a ba和b可以是常量、变量或者表达式。当两边的a和b至少有一个为假时整个表达式的结果就为假当两边的a和b都为真时整个表达式的结果才为真printf(%d\n,(32)(79));//打印结果为1printf(%d\n,(32)(3!2));//打印结果为0printf(%d\n,(42)(58));//打印结果为0(2) ||逻辑或操作符双目操作符。逻辑或就是或者的意思。形式为a || ba和b可以是常量、变量或者表达式。当||两边的a和b至少有一个为真时整个表达式的结果就为真当||两边的a和b都为假时整个表达式的结果才为假printf(%d\n,(32)||(79));//打印结果为1printf(%d\n,(76)||(4!4));//打印结果为1printf(%d\n,(42)||(58));//打印结果为0▲ 逻辑操作符的短路现象(1) 逻辑与短路对于表达式a b当左边的a已经是假了那右边的b就不会判断了。因为左边的a已经为假则整个表达式的结果就为假。(2)逻辑或短路逻辑或短路也是相似的对于表达式a || b当||左边的a已经是真了那右边的b就不会判断了。因为左边的a已经为真则整个表达式的结果就为真。对于逻辑操作符的短路现象就是仅仅根据左操作数的结果就能知道整个表达式的结果而不再对右操作数进行计算这就是短路现象。4. (复合)赋值操作符(1) (赋值操作符)赋值运算是将赋值号右边的值赋给左边的变量。赋值号右边的值可以是常量、变量或者表达式而赋值号左边必须是一个变量。(2) 复合赋值运算符(加等于)、-(减等于)、*(乘等于)、/(除等于)、%(模等于)● (加等于)把右操作数加上左操作数的结果再赋值给左操作数。举一个例子就明白了inta5;a3;//等价于aa3printf(%d\n,a);//打印结果为8定义了一个整型变量a并初始化其值为5。a3的意思就是aa3将变量a的值加上常量3后的结果赋给变量a则a的值变为了8。复合赋值操作符其实就是算术运算符结合赋值运算符的一种简化。上面的其他复合赋值操作符也是相应的算术运算符结合赋值操作符的意思。赋值操作符及复合赋值操作符都是双目操作符因为他们都有两个操作数。5. 单目操作符(1) !(非)逻辑反操作符。通俗来说就是将真变为假假变为真。printf(%d\n,32);//打印结果为1printf(%d\n,!(32));//打印结果为0(2) 操作符也叫自增运算符分为前置和后置。① 前置#includestdio.hintmain(){inta1;intba;printf(a %d\n,a);printf(b %d\n,b);return0;}运行结果由上面的代码及结果可知前置的作用是先将变量的值加1以后再使用变量的值。就像上面的例子a可以理解为先让变量a自增1(aa1)然后再使用a的值此时a的值为2(先加1后使用)。你也可以理解为a这个表达式的值就为2当执行完a这个表达式后会使a的值自增1#includestdio.hintmain(){inta1;printf(a %d\n,a);printf(a %d\n,a);return0;}运算结果② 后置#includestdio.hintmain(){inta1;printf(a %d\n,a);printf(a %d\n,a);return0;}运行结果后置的意思就是先使用变量的值然后再让变量的值自增1(先使用后加1)。就像上面的代码a是先使用a的值a的值为1所以a这个表达式的值为1。当a这个表达式执行完毕后会让a的值自增1(aa1)。你可以理解为a这个表达式的值就为原来a的值执行完这条语句后a的值自增1。(3) - -操作符:也叫自减操作符也是分为前置- -和后置- -。用法和意思和前面的操作符类似#includestdio.hintmain(){intn4;//前置--printf(--n %d\n,--n);//先让n自减1然后再使用n的值printf(n %d\n,n);//后置--printf(n-- %d\n,n--);//先使用n的值然后让n自减1printf(n %d\n,n);return0;}运行结果注意无论是前置、- -或是后置、- -到表达式执行完毕后都会使变量的值自增1或者自减1。(4) 取地址操作符顾名思义就是取出变量的地址。#includestdio.hintmain(){intn1;n;//取出变量n的地址int*pn;//将变量n的地址存到指针变量p中return0;}(5) *解引用操作符用于指针(地址)获取指针所指向单元的内容。用法如下#includestdio.hintmain(){inta10;int*pa;*p20;printf(a %d\n,a);//打印结果为20return0;}有了*操作符就多了一种修改变量值的途径。可以通过解引用操作符对指针进行解引用间接的访问指针所指向对象的内容。(6) sizeof操作符用于求一个变量或者类型所占空间的大小单位是字节。#includestdio.hintmain(){intb10;printf(%d\n,sizeof(b));printf(%d\n,sizeofb);printf(%d\n,sizeof(int));return0;}sizeof操作符求变量的大小时后面的( )可以省略。还需要注意的是sizeof操作符中放的如果是表达式则表达式是不会计算的但是会判断表达式最终结果的数据类型由此计算出最终结果的大小(单位字节)。#includestdio.hintmain(){inta10;charb\0;printf(%d\n,sizeof(a10));printf(%d\n,sizeof(bab));return0;}运行结果(7) (类型)强制类型转换。作用就是将表达式的类型转换为括号中类型名指定的数据类型。#includestdio.hintmain(){inta10;floatb3.14f;a(int)b;//将浮点型变量b强制类型转换成整型赋给aprintf(a %d\n,a);//打印结果为3return0;}上面的变量a是一个整型而变量b是一个浮点型数据如果直接将b的值赋给a则类型就不兼容。所以将b强制类型转换成整型(去掉小数点后的值保留整数部分)再赋给a。用法是在变量或者表达式的前面加上一个( )( )内注明要转换的类型。强制类型转换是将所需变量或者表达式的值转换为我们需要的类型不会改变该变量或表达式的值和类型。在后面的学习中会遇到更多强制类型转换的代码这里先做一个大概的了解。6. 条件操作符? :(条件操作符)。条件操作符是C语言中唯一的一个三目操作符意思就是他有三个操作数。#includestdio.hintmain(){inta0;intb0;printf(请输入a和b的值);scanf(%d %d,a,b);intcab?a:b;printf(%d\n,c);return0;}运行结果条件操作符的格式表达式1 表达式2 : 表达式3① 当表达式1的结果为真(非0)时则计算表达式2表达式2的结果就为整个表达式的结果。② 当表达式1的结果为假(0)时那么就计算表达式3表达式3的结果就为整个表达式的结果。上面的3个表达式可以是变量、常量或者表达式。#includestdio.hintmain(){inta0;intb0;printf(请输入a和b的值);scanf(%d %d,a,b);intcab?a-2:b3;printf(%d\n,c);return0;}运行结果7. 逗号表达式表达式1表达式2表达式3…逗号表达式也是一个操作符。用,将各个表达式分隔开(英文半角状态下的逗号)。运算法则是按从左往右的顺序计算各个表达式。#includestdio.hintmain(){intx7;inty9;intm12;intn1;inta(xy1,ym,mn,nxym);printf(x %d y %d m %d n %d a %d,x,y,m,n,a);return0;}运行结果通过上面的代码及运行结果第八行的代码因为( )的优先级高于赋值操作符()所以会先计算( )里面的逗号表达式因为逗号表达式是左结合性所以会从左往右顺序计算各个表达式最后一个表达式的结果就是整个表达式的结果。注意上面第八行的逗号表达式是用( )整体括起来的然后再赋值给变量a。如果没有打( )就是另外一种情况#includestdio.hintmain(){intx7;inty9;intm12;intn1;inta0;axy,ym,mn,nxym;printf(x %d y %d m %d n %d a %d,x,y,m,n,a);return0;}运行结果上面第九行的代码也是逗号表达式只是这里没有对逗号表达式整体打括号因为逗号表达式是C语言中优先级最低的运算符所以相比较于逗号表达式赋值操作符的优先级高就会将xy计算后的值赋值给a而不是将最后一个表达式的结果赋给a。除非像上面一样逗号表达式整体加了括号以后(a(xy,ym,mn,nxym))才会将最后一个表达式的结果赋给a。这里虽然没有整体打括号但由于逗号表达式的左结合性上面第九行的逗号表达式会从左往右依次计算各个表达式。通过上面的输出结果就可以看出来了。8.下标引用操作符[ ]下标引用操作符。是在数组中使用的是一个双目操作符用于访问数组中的元素。#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};inti0;for(i0;i10;i){printf(%d ,arr[i]);}return0;}下标引用操作符也是一个双目操作符[ ]左边的数组名和[ ]中的下标就是它的操作数。其实两个操作数的位置是可以交换的也就是数组名放在[ ]中下标放在[ ]的左边这种也是可以的。9.函数调用操作符( )函数调用操作符在调用函数时函数名后面的( )就是函数调用操作符。( )的操作数是函数名、参数。而且函数调用操作符最少有一个操作数那就是函数名因为有的函数是没有参数的。#includestdio.hintAdd(intx,inty){returnxy;}voidtest(){printf(I am xionger!);}intmain(){intx10;inty20;printf(%d\n,Add(x,y));//这里的()就是函数调用操作符test();//这里的()就是函数调用操作符return0;}10.结构成员访问操作符(1) 结构体成员的直接访问就可以使用.操作符。使用方法是结构体变量.成员名。#includestdio.hstructStu{charname[20];charsex[12];intage;charid[10];};intmain(){structStus1{张三,男,20,202400101};printf(%s %s %d %s\n,s1.name,s1.sex,s1.age,s1.id);//直接访问return0;}运行结果(2)结构体成员的间接访问可以使用-操作符通过结构体指针来实现对结构体成员的间接访问。#includestdio.hstructStu{charname[20];charsex[12];intage;charid[10];};intmain(){structStus1{张三,男,20,202400101};structStu*ps1;printf(%d %s %s %s\n,p-age,p-sex,p-name,p-id);//间接访问return0;}运行结果上面只是初步了解这些操作符的意思和使用方法在后期的学习中还会更深入的接触和学习到上面的众多操作符。上面还有关于位的众多操作符和运算符的优先级还没有学习我们放到下一章节学习。

相关新闻

四款企业AI知识库深度评测

四款企业AI知识库深度评测

2026/7/24 22:52:19

四款企业AI知识库深度评测佑桥、飞书、语雀、蓝凌,谁更适合你的企业?2026年,企业AI知识库赛道百花齐放。打开搜索引擎,你会发现市面上至少有几十款产品在争夺企业IT决策者的注意力。但如果要选出四款最具代表性、技术路线最差异化…

使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查

使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查

2026/7/24 22:52:19

作者:来自 Elastic Ori Shafir 及 Arnon Stern AutoOps 为 Elastic Cloud Hosted 部署和 Cloud Connect 集群引入了更清晰的严重级别、更新后的页面布局以及更简单的问题排查流程。 通过实时问题检测和可执行的优化建议,简化你的 Elasticsearch 运维&am…

不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署

不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署

2026/7/24 22:52:19

作者:来自 Elastic Scott Martens 全部 28 个 Jina AI 模型(包括 reranker),现已提供可直接部署的 Docker 容器,无遥测数据收集,无需许可证服务器。可直接兼容 OpenAI、Cohere、Voyage AI 和 Elastic Infer…

任务管理系统开发:架构设计与性能优化实践

任务管理系统开发:架构设计与性能优化实践

2026/7/24 23:42:21

1. 项目概述"task5"这个看似简单的标题背后,其实隐藏着一个典型的任务管理系统开发项目。作为一名经历过多个敏捷开发周期的技术负责人,我深知任务管理工具对团队协作效率的决定性影响。这个项目很可能是一个轻量级的任务追踪系统,…

YOLOv8在水稻病害智能检测中的实践与优化

YOLOv8在水稻病害智能检测中的实践与优化

2026/7/24 23:42:21

1. 项目背景与核心价值水稻作为全球主要粮食作物,其病害防控直接影响粮食安全。传统病害识别依赖农技人员目测,存在效率低、主观性强等问题。本项目采用YOLOv8构建的智能检测系统,可实现田间病害的实时自动化识别,平均识别速度达到…

电商AI Agent架构设计与智能导购系统实现

电商AI Agent架构设计与智能导购系统实现

2026/7/24 23:42:21

1. 电商场景下的AI Agent技术架构解析在电商领域部署AI Agent系统时,我们通常采用分层架构设计。最底层是数据接入层,通过API网关整合商品数据库、用户行为日志、交易系统等数据源。中间层是核心AI引擎,包含自然语言处理模块(处理…

千笔智能体:AIGC降噪技术提升内容自然度

千笔智能体:AIGC降噪技术提升内容自然度

2026/7/24 23:42:21

1. 项目概述:千笔专业降AI率智能体的核心定位作为一款定位"断层领先"的AIGC降噪工具,千笔智能体在内容创作领域解决了一个关键痛点:如何让AI生成内容更接近人类创作的自然感。我在实际测试中发现,当前市面上大多数AI写作…

Excel/WPS自动化排班表制作:函数+条件格式+数据有效性实战

Excel/WPS自动化排班表制作:函数+条件格式+数据有效性实战

2026/7/24 23:42:21

今天我们来解决一个实际问题:如何用Excel或WPS制作自动化的员工排班表。无论是企业HR、部门主管还是小店老板,只要涉及多人轮班,手工排班既耗时又容易出错。通过函数公式、条件格式和数据有效性的组合,我们可以实现排班表的半自动…

ComfyUI BrushNet图像修复终极指南:7个关键技巧解决90%的配置难题

ComfyUI BrushNet图像修复终极指南:7个关键技巧解决90%的配置难题

2026/7/24 23:32:21

ComfyUI BrushNet图像修复终极指南:7个关键技巧解决90%的配置难题 【免费下载链接】ComfyUI-BrushNet ComfyUI BrushNet nodes 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BrushNet ComfyUI BrushNet是一款基于分解双分支扩散模型的AI图像修复工具…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/24 4:17:29

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/24 19:29:25

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

Django毕设项目:基于 Django 的 智能化学生综合素质测评审核系统 校园学生评优评奖综合管理系统(源码+文档,讲解、调试运行,定制等)

Django毕设项目:基于 Django 的 智能化学生综合素质测评审核系统 校园学生评优评奖综合管理系统(源码+文档,讲解、调试运行,定制等)

2026/7/24 0:01:07

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

[具身智能-634]:Python 封装的地平线 VIO 多媒体库:libsrcampy库详解

[具身智能-634]:Python 封装的地平线 VIO 多媒体库:libsrcampy库详解

2026/7/24 0:01:07

srcampy /libsrcampy 名称释义先明确结论: 官方文档没有公布标准化英文全称,是地平线内部项目缩写;行业公认拆解如下:srcampy Source Amplifier Python bindingsrc Source(图像源:MIPI Sensor、视频源&am…

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

2026/7/24 0:01:07

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…