c语言-操作符详解(含优先级与结合性)
文章目录
- 了解什么是操作数、操作符
- 操作数:
- 操作符
- 操作符详解:
- 1.算术操作符: + 、- 、* 、/ 、%
- 2.移位操作符: << >>
- 3.位操作符: & | ^
- 4. 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
- 5. 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)
- 6.关系操作符: > 、>= 、< 、<= 、 == 、 !=
- 7. 逻辑操作符: && 、||
- 8. 条件操作符: ? :
- 9. 逗号表达式: ,
- 10. 下标引⽤: []
- 11. 函数调⽤: ()
- 12.结构体成员访问符
- 操作符的优先级与结合性
- 优先级
- 结合性
- 优先级与结合性表
- 整形提升
- 算术转换
了解什么是操作数、操作符
操作数:
操作数是用于运算的数字或者表达式
如:
1 . 1+1

2.(a+b)*3

操作符
操作符,也称运算符。是对数据进行操作处理的符号。
操作符有很多,常见操作符有:单目操作符、算数操作符、移位操作符、位操作符、赋值操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构体成员。
操作符详解:
1.算术操作符: + 、- 、* 、/ 、%
+、- 、* 、/ 、% 这些算术操作符分别对应数学上的加、减、乘、除、取余数
如:
int main() {int a = 10, b = 4;printf("a+b=%d\n", a + b);//加printf("a-b=%d\n", a - b);//减printf("a*b=%d\n", a * b);//乘printf("a/b=%d\n", a / b);//除printf("a%b=%d\n", a %b);//取余数return 0;
}
运行结果:

注:除号 / ,因为求的结果是整数,舍掉小数点后面的数,所以10/4=2
2.移位操作符: << >>
这我在之前的文章讲过,这里放个链接需要的可以去看看哦:http://t.csdnimg.cn/JL6ao
3.位操作符: & | ^
这我在之前的文章讲过,这里放个链接需要的可以去看看哦:http://t.csdnimg.cn/JL6ao
4. 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
赋值操作符 =
当我们要对变量初始化时或者给变量赋一个值时就可以使用(注:这不是我们数学上的等于号噢)
如:
int main() {int a = 10;//初始化,将10赋给aint b;b = 20;//赋值,将20赋给bprintf("a=%d b=%d", a,b); return 0;
}
运行结果:

连续赋值:
如:
int main() {int a,b;a = b = 10;//将10赋给b,再将b赋给aprintf("a=%d b=%d", a, b);return 0;
}
运行结果:

注意的是在初始化时不能进行连续赋值 如:int a = b = 10;//err
运行会报错,如:

复合赋值
就是将原来运算的过程简化,如:

int main() {int a = 10;int b = 20;a += b;//等于a+bprintf("%d", a);return 0;
}
运行结果:

不仅能和 +,还能和 -、*、/等操作符一起复合使用
5. 单⽬操作符: !、++、–、&、*、+、-、~ 、sizeof、(类型)
- 在c语言中规定0为假,非0为真
- ! 逻辑取非运算符:在判断条件时使用,如:(!真 ) 那么它的结果就为假
如:
int main() {int a = 1;if (!3) {printf("a为0");}elseprintf("a不为0");return 0;
}
运行结果:

++
++分为前置++和后置++
区别:前置++是先+1再使用,后置++是先使用后++
如:
int main() {int a = 2;int b = 2;printf("a=%d\n", a++);//后置++,先使用,所以这里a的值不变 打印 a=2printf("b=%d", ++b);//前置++,先+1,后使用,所以这里打印b=3return 0;
}
运行结果:

** – **
–分为前置–和后置–
区别:前置–是先-1再使用,后置–是先使用后–
如:
int main() {int a = 2;int b = 2;printf("a=%d\n", a--);//后置--,先使用,所以这里打印 a=2printf("b=%d", --b);//前置--,先-1,后使用,所以这里打印b=1return 0;
}
运行结果:

取地址操作符&
用于取变量在内存中的地址
如:
int main() {int a = 10;printf("%p", &a);//取出a的地址,%p用于打印地址return 0;
}
运行结果:

解引用操作符 ( * )
( * )用于指针 ,放在指针变量的前面,如:*p,*p通过指针变量p中存放的地址,找到指向的空间
如:
int main() {int a = 10;int* p = &a;*p = 5;//通过解引用符来找到p指向的空间,此时*p==a,改变*p即改变aprintf("a=%d", a);return 0;
}
运行结果:

+、-
这个并不是算术运算符的 +、 -,而是取正负的操作符,+(正)、-(负)。
如:
int main() {int a = 10;printf("+a=%d\n", +a);//a不变printf("-a=%d\n", -a);//a等于-10return 0;
}
运行结果:

~按位取非
运算规则:将一个操作数全部取反(在二进制的基础上取非),不懂原码、反码、补码、进制的可以看看这个链接的内容:http://t.csdnimg.cn/JL6ao
如:将int a=1取反

sizeof()
计算变量的所占内存空间大小,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量的所占空间的大小
如:
int main() {int a = 10;int arr[10];printf("%d\n", sizeof(a));//变量printf("%d\n", sizeof(int));//类型printf("%d\n", sizeof(arr));//在计算数组大小时在()输入数组名即可return 0;
}

int类型的字节大小为4字节,arr[10],为10个int型的数据所以为40
(类型)
()强制类型转换,如(int)9.8,将浮点数转化为整数
如:
int main() {double a = 9.8;printf("%d\n",(int)a);//return 0;
}
运行结果:

转化之后舍掉小数
6.关系操作符: > 、>= 、< 、<= 、 == 、 !=
. > 、>= 、< 、<= 、 == 、 !=,这些符号分别是大于、大于等于、小于、小于等于、等于、不等于
注意:>=、<=这两是规定的写法,不要写成=<、=>这种形式
主要用于判断表达是的真假
如:
int main() {int a = 0, b = 10;if (a<b) {//这里b大于a,表达式为真,执行下面语句printf("a<b");}return 0;
}
运行结构:

7. 逻辑操作符: && 、||
逻辑与操作符 &&:
1.简单来说就是并且的意思,判断两个表达式若都为真则为真,有一个或者都为假则为假
2.有个特点就是当判断第一个表达式为假时,就不会判断后面的了,直接判断为假

如:
int main() {int a = 0, b = 2;if (a && b) {printf("yes");}elseprintf("no");return 0;}
运行结果:

这里a=0,当判断a=0时,就不会去判断b了,这里直接就为假了
逻辑或操作符 ||:
1.可以简单理解为或者,判断两个表达式中有一个为真则为真,当两个表达式都为假时才判断为假
2.当判断第一个表达式为真时就不会判断后面的表达式了,直接判断为真

如:
int main() {int a = 0, b = 2;if (b || a) {printf("yes");}elseprintf("no");return 0;
}
运行结果:

这里当判断b为真时就不会进行后面的判断了,直接判断为真
8. 条件操作符: ? :
条件操作符:
1.? : 为三目运算符
2. 格式:int c = (a > b)?a:b;//(表达式1)?(表达式2):(表达式3)
3.当表达式1为真时就会执行表达式2,当表达式1为假时就会执行表达式3
如:
int main() {int a = 0, b = 2;int c = (a > b)?a:b;//(表达式1)?(表达式2):(表达式3)printf("%d", c);return 0;
}
运行结果:

这里表达式1为假所以执行表达式3,将b赋给c
9. 逗号表达式: ,
逗号表达式:
1.格式:
c int d = a, b, c;//()表达式1),(表达式2),(表达式3)......,已最后一个为标准
2.逗号表达式,就是⽤逗号隔开的多个表达式。
3.逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
如:
i
nt main() {int a = 0, b = 2;int c = 10;int d =(a++,b=a+b, c+b);//a++,a=1,b=a+b=3,c+b=13, d=13printf("%d", d);return 0;
}
运行结果:

10. 下标引⽤: []
下标引⽤:
1.格式:
arr [ a ]//arr为数组名,a为下标(索引值)
2.用于找到数组具体位置的值
如:
int main() {int arr[] = { 1,2,3 };printf("%d", arr[1]);//arr[1]=2;return 0;
}
运行结果:

11. 函数调⽤: ()
函数调⽤:
1.接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
2.add()//add(函数名)为第一个操作数,()里可以放0个或者多个操作数(参数)
如:
int add(int x, int y) {return x + y;
}
int main() {int a = 10;int b = 5;int c = add(a, b);//add,a,b都为操作数printf("%d", c);return 0;
}
运行结果:

12.结构体成员访问符
直接访问: .
格式:结构体名 . 成员名
p.a
如:
struct tag {int a;int b;
};
int main() {struct tag p = { 5,10 };printf("a=%d b=%d", p.a,p.b);return 0;
}
运行结果:

间接成员访问符:->
1.有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针,这时就要用到 ->
2.格式:结构体指针->成员名 p1->a
如:
struct tag {int a;int b;
};
int main() {struct tag p= { 5,10 };struct tag* p1 = &p;printf("a=%d b=%d", p1->a,p1->b);return 0;
}
运行结果:

13.圆括号()
将括号内的看成一个整体,先算完括号内在算其他,在不确定优先级时可以用
操作符的优先级与结合性
优先级
简单来说就是先运算那一部分,和我们学的加减乘除意思差不多,在有加法和乘法的情况下,先算乘法再算加法
如:
int main() {int a = 10, b = 2;int c = b + -a * b;//这里有 -(负号) + * 三种运算符printf("c=%d" ,c);return 0;
}
因为 优先级 -(负号)> * >+,所以先算-a=-10,再-10 * b=-20,最后再加2,所以c=-18
运行结果:

结合性
简单来说就是操作数与操作符之间谁和谁先在一起,分为自左向右和自右向左两个方向
如:
int c = a + b;
- 是左向右结合:先跟a结合在与b,=赋值运算符是右向左结合,先跟(a+b)结合,再与c结合
优先级与结合性表

规律:

优先级有上到下递减
整形提升
什么是整形提升:
1.C语⾔中整型算术运算总是⾄少以缺省整型类型的精度来进⾏的。
2.为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。
意义:
1.表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为int或unsigned
int,然后才能送⼊CPU去执⾏运算。
2.通过整形计算完后会进行截断
3.有符号和无符号在一起时,有符号转为无符号计算
4.char、short,转为int计算,就算完后截断
如何提升
- 有符号整数提升是按照变量的数据类型的符号位来提升的
- ⽆符号整数提升,⾼位补0
如:
int mian() {char a = -1;//有符号unsigned char b = -1;//无符号printf("a=%d\nb=%d", a, b);return 0;
}
char a=1

unsigned char b = -1

运行结果:

再如:
char a=1 ,char b=-2,计算a+b
int main() {char a = 1;char b = -2;unsigned char c = a + b;printf("a+b=%d,c=%d", a+ b,c);return 0;
}

运行结果:

short也是如此,感兴趣的可以去试试
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。下⾯的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算
如:
int main() {double a = 9.8;int b=3;printf("%lf", a + b);return 0;
}
运行结果:

这里打印double类型的数,所以编译器会将a转为double类型的计算
以上就是我的分享了,如果由有错误的地方,欢迎在评论区留言
最后 谢谢大家的观看!
相关文章:
c语言-操作符详解(含优先级与结合性)
文章目录 了解什么是操作数、操作符操作数:操作符 操作符详解:1.算术操作符: 、- 、* 、/ 、%2.移位操作符: << >>3.位操作符: & | ^4. 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^5. 单⽬操…...
ubuntu安装nvm
需求 在 virtualbox 虚拟机上运行的 ubuntu (22.04.3)里安装 nvm (Node Version Manager) 简述 官网文档 (github地址)上有提到两种安装方式,一种是直接 curl | wget 命令安装,一…...
opengl制作天空盒
首先创建顶点数组 unsigned int m_uiVaoBufferID; glGenVertexArrays(1, &m_uiVaoBufferID); 然后创建顶点缓冲区 float skyboxVertices[] {// positions-1.0f, 1.0f, -1.0f,-1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f,-1.0f, 1.…...
单片机和FreeRTOS上跑机器人ROS的应用
机器人的应用越来越广泛了,大家熟知的稚晖君直接创业搞机器人,可想而至,接下来的十年,机器人绝对是热门的行业。 目前市面上很多机器人都是基于一套叫做ROS的系统开发的,今天就给大家分享一个跑在MCU上,基…...
Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】
文章目录 数据聚合聚合的种类DSL实现聚合RestAPI实现聚合 自动补全拼音分词器自定义分词器自动补全查询completion suggester查询RestAPI实现自动补全 数据同步数据同步思路分析实现elasticsearch与数据库数据同步 集群搭建ES集群创建es集群集群状态监控创建索引库1)…...
【gitlab初始密码登录失败】
gitlab初始密码登录失败 修改密码 修改密码 [rootlocalhost ~]# gitlab-rake "gitlab:password:reset[root]" Enter password: Confirm password: Password successfully updated for user with username root. # 再重新配置gitlab [rootlocalhost ~]# gitlab-ctl…...
2017年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版
文章目录 2017 级考研管理类联考数学真题解析一、问题求解(本大题共 5 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2017-…...
2、基础入门——web应用架构搭建漏洞HTTP数据包代理服务器
Web应用环境架构类 开发语言:php、java、python、ASP、ASPX等程序源码:用的人多了,就成CMS了。中间件容器:IIS、Apache、Nginx、Tomcat、Weblogic、Jboos、glasshfish等数据库类型:Access、Mysql、Mssql、Oracle、Red…...
【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码
1.研究背景与意义 随着计算机视觉和图像处理技术的快速发展,人们对于多摄像头拼接行人检测系统的需求日益增加。这种系统可以利用多个摄像头的视角,实时监测和跟踪行人的活动,为公共安全、交通管理、视频监控等领域提供重要的支持和帮助。 …...
力扣算法练习BM45—滑块窗口的最大值
题目 给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针…...
最小二乘估计及与极大似然估计的关系
最小二乘估计(Least Squares Estimation)和极大似然估计(Maximum Likelihood Estimation)是统计学中常用的参数估计方法,它们在某些情况下是等价的,但在一般情况下并不总是相同的。 最小二乘估计ÿ…...
02房价预测
目录 代码 评分算法: 代码 import numpy as np from sklearn import datasets from sklearn.linear_model import LinearRegression# 指定版本才有数据集 # C:\Users\14817\PycharmProjects\pythonProject1\venv\Scripts\activate.bat # pip install scikit-le…...
【Springboot】pom.xml中的<build>标签详解
默认值及其标签解释 <build><!-- 指定最终构建产物的名称, 例如生成的 JAR 文件的名称 --><finalName>${artifactId}-${version}</finalName><!-- 指定源代码文件的目录路径 --><sourceDirectory>src/main/java</sourceDirectory>&l…...
智能驾驶产品开发中如何贯彻“正向开发”理念
摘要: 基于演绎法的正向开发理念,能够让智能驾驶产品在充分满足用户需求,保证产品质量的同时,确保开发目标合理且得到落实。 前段时间,微博CEO吐槽理想L9智能驾驶“行驶轨迹不居中”,在网上引发了热烈讨论…...
【机器学习】038_梯度消失、梯度爆炸
一、原因 神经网络梯度 假设现在有一个 层的神经网络,每层的输出为一个对输入作 变换的函数结果 用 来表示第 层的输出,那么有下列公式: 链式法则计算损失 关于某一层某个参数 的梯度: 注意到, 为向量&am…...
【转】OAK-D双目相机进行标定及标定结果说明
编辑:OAK中国 首发:A. hyhCSDN 喜欢的话,请多多👍⭐️✍ 内容来自用户的分享,如有疑问请与原作者交流! ▌前言 Hello,大家好,这里是OAK中国,我是助手君。 近期在CSDN刷…...
whip和whep
原文为runner365.git大佬的文章 原文链接:https://blog.csdn.net/sweibd/article/details/124552793 WHIP接口 什么是whip 全称: WebRTC-HTTP ingestion protocol (WHIP). rfc地址: rfc-draft-murillo-whip-00 简单说,就是通过HTTP接口能导入webrtc媒…...
SpringBoot集成jjwt和使用
1.引入jwt依赖(这里以jjwt为例,具体其他jwt产品可以参见jwt官网) <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>…...
RedisConnectionFactory is required已解决!!!!
1.起因🤶🤶🤶🤶 redis搭建完成后,准备启动主程序,异常兴奋,结果报错了!!!! 2.究竟是何原因 😭😭😭…...
redis的高可用之持久化
1、redis的高可用考虑指标 (1)正常服务 (2)数据容量的扩展 (3)数据的安全性 2、redis实现高可用的四种方式 (1)持久化 (2)主从复制 (3&…...
MySQL 8.0.12安装后必做的5件事:安全加固、性能调优与可视化工具推荐
MySQL 8.0.12安装后必做的5件事:安全加固、性能调优与可视化工具推荐 刚完成MySQL 8.0.12安装的开发者常会遇到这样的困惑:明明按照教程一步步操作,为什么数据库用起来总觉得不够顺手?命令行操作繁琐、默认配置性能平平、安全隐患…...
【Python类型调试终极指南】:20年资深工程师亲授3大隐性类型错误排查法,90%开发者至今不知
更多请点击: https://intelliparadigm.com 第一章:Python类型调试的本质与认知革命 从动态到可推断:类型系统的双重角色 Python 的动态类型特性赋予开发灵活性,却也让运行时类型错误成为调试主力战场。类型调试并非仅检查 type…...
怎样高效实现OBS多平台推流:Multi RTMP插件完整操作手册
怎样高效实现OBS多平台推流:Multi RTMP插件完整操作手册 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 想要同时在多个直播平台进行内容分发,却苦于重复配置推流…...
5分钟解放你的游戏时间:三月七小助手完全指南
5分钟解放你的游戏时间:三月七小助手完全指南 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 还在为《崩坏:星穹铁道》的重复性日常任务感到疲…...
go语言使用互斥锁进行同步
我们可以利用互斥锁来保护代码中的关键部分,从而确保每次只能有一个goroutine访问共享资源。这样一来,就能避免竞争条件的问题。几乎所有支持并发编程的语言中,都使用了类似互斥锁的机制。在本章中,我们首先会了解互斥锁的功能。之…...
零售业供应链数字化实战:拆解爱室丽Ashley的EDI项目如何用3周快速上线(AS2+API方案解析)
零售业供应链数字化实战:拆解爱室丽Ashley的EDI项目如何用3周快速上线(AS2API方案解析) 在家居零售行业,供应链效率直接决定了企业的市场竞争力。当订单响应速度慢、库存信息滞后成为常态时,头部企业早已开始通过数字化…...
16.人工智能实战:大模型回答格式总是不稳定?JSON Schema 约束、重试修复与结构化输出完整方案
人工智能实战:大模型回答格式总是不稳定?JSON Schema 约束、重试修复与结构化输出完整方案一、问题场景:AI 回答内容对了,但系统解析失败 在很多 AI 应用中,模型不是只负责聊天,而是要输出结构化结果。 例如…...
Agent 一接 Canvas 图表页就开始读错数据:从 Bitmap OCR 到 Semantic Overlay 的工程实战
很多团队把浏览器 Agent 接进运营大屏后,第一批事故并不是按钮点不到,而是图表读错了。⚠️ 页面上明明显示“退款率上升”,执行器却把另一条系列当成目标,随后导出错误结论、点击错误筛选,整条分析链路都被带偏。 人…...
STM32H743 FDCAN配置避坑指南:从共享RAM分配到滤波器设置,手把手教你搞定双CAN通信
STM32H743 FDCAN配置避坑指南:从共享RAM分配到滤波器设置,手把手教你搞定双CAN通信 在嵌入式系统开发中,CAN总线因其高可靠性和实时性被广泛应用于汽车电子、工业控制等领域。STM32H743作为STMicroelectronics的高性能MCU系列,其F…...
Taotoken 用量看板如何帮助开发者精细化管控 API 成本
Taotoken 用量看板如何帮助开发者精细化管控 API 成本 1. 用量看板的核心功能 Taotoken 控制台提供的用量看板功能,允许开发者从多个维度实时监控 API 调用情况。该功能默认展示最近 30 天的数据,支持按小时、天、周或自定义时间范围筛选。主要数据指标…...
