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、(类型)

  1. 在c语言中规定0为假,非0为真
  2. ! 逻辑取非运算符:在判断条件时使用,如:(!真 ) 那么它的结果就为假

如:

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计算,就算完后截断

如何提升

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. ⽆符号整数提升,⾼位补0

如:

int mian() {char a = -1;//有符号unsigned char  b = -1;//无符号printf("a=%d\nb=%d", a, b);return 0;
}

char a=1
![在这里插入图片描述](https://img-blog.csdnimg.cn/88f14fcb6cb24ac89fc98e357b08c30c.png

unsigned char b = -1
![在这里插入图片描述](https://img-blog.csdnimg.cn/8c73603c71c94a08bbdf00f87228564c.png

运行结果:
在这里插入图片描述
再如:
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类型的计算

以上就是我的分享了,如果由有错误的地方,欢迎在评论区留言
最后 谢谢大家的观看!

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

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

相关文章

MySQL用户与权限管理

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;博主会及时修改&#xff09; MySQL用户与权限管理 登录 #本地登录 mysql -uroot -p123456#远程登录 #客户端语法&#xff1a;mysql -…

Springboot_文件下载功能(前端后端)

遇到的问题&#xff1a; 文件下载后文件一直被破坏&#xff0c;无法正常打开文件名乱码&#xff0c;如图 刚开始一直在纠结&#xff0c;是不是后端没有写对&#xff0c;然后导致下载不能使用 后来搜索了一些资料&#xff0c;发现后端没什么问题 然后就开始找到其他项目对比…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

C++:继承

一、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层次结构&#xff0c…

万宾科技智能井盖传感器,预防城市道路安全

随着城市交通的不断发展和城市化进程的加速推进&#xff0c;城市道路安全问题日益凸显。市政井盖作为城市道路的一部分&#xff0c;承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施&#xff0c;补足传统管理方式的…

oracle “ORA-25153:临时表空间为空”

从生产上面备份出来了一个数据库&#xff0c;应用在使用时显示ORA-25153临时表空间为空的报错&#xff0c;原因一般是数据库迁移时&#xff0c;没有迁移完整造成的 解决方法 1.创建新的临时表空间temp2 create temporary tablespace temp2 tempfile DATA size 100M autoexten…

杭电oj 2064 汉诺塔III

#include <stdio.h>void main() {int n, i;long long sum[35] { 2,8,26 };for (i 3; i < 35; i)sum[i] 3 * sum[i - 1] 2;while (~scanf_s("%d", &n))printf("%lld\n", sum[n - 1]); }

python实现调和反距离空间插值法AIDW

1 简介 AIDW 主要是针对 IDW 的缺点进行了改进&#xff0c;考虑了样本点与预测点的位置&#xff0c;即方向和距离&#xff0c;具体见下图&#xff1a; 2 改进 IDW 公式&#xff1a; 从IDW算法可看出&#xff0c;插值点的估算值仅与插值样本距插值点的远近相关&#xff0c;并未…

@PropertySource适配通配符加载到Environment的一种方案

PropertySource可将配置文件加载到内存&#xff0c;时间有限说干的&#xff0c;PropertySource注解有4个参数&#xff0c;其中value表示要加载文件的路径&#xff0c;这个参数不支持通配符。还有一个参数PropertySourceFactory是加载配置文件的工厂&#xff0c;这两个参数配合使…

Sqli-lab教程-史上最全详解(1-22通关)

目录 Less-1 联合注入 Less-2 Less-3 Less-4 Less-5 报错注入/布尔盲注/时间盲注 Less-6 报错注入/布尔盲注/时间盲注 Less-7 文件导出 Less-8 布尔盲注/时间盲注 Less-9 时间盲注 Less-10 时间盲注 Less-11 post注入 Less-12 post注入 Less-13 post盲注 Less-14 post盲注 Less…

部署jekins遇到的问题

jdk问题 我用的jdk版本是21的结果版本太新了&#xff0c;启动jekins服务的时候总是报错最后在jekins的安装目录下面的jekinsErr.log查看日志发现是jdk问题最后换了一个17版本的就解决了。 unity和jekins jekins和Git源码管理 jekins和Git联动使用 我想让jekins每次打包的时…

【Java 进阶篇】Redis:打开缓存之门

介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储系统&#xff0c;被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中&#xff0c;我们将深入了解Redis的概念、安装以及基本…

八、ffmpeg录制视频为yuv文件

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 图片的一些重要知识&#xff1a; RGB图片 位深度&#xff1a;每一个像素都会使用n个二进制位来存储颜色信息。每一个像素的颜色都是由红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff0…

Linux学习笔记-Ubuntu下使用Crontab设置定时任务

文章目录 一、概述二、基于crontab的设置2.1 基本命令说明2.2 使用-e指令编辑命令2.2.1 进入编辑模式2.2.2 指令信息格式2.2.4 开启日志1) 修改rsyslog配置文件2) 重启rsyslog3) 查看日志 2.2.3 设置后之后重启服务 三、示例3.1 每隔一分钟往文件中日期3.2 使用-l查看任务列表3…

教你如何将Web项目部署到Linux中

文章目录 前言0. 什么是部署1. 调整代码达成一致2. 数据库建表3. 构建项目并打包4. 拷贝到 Tomcat 中5. 效果总结 前言 在我们完成了一个Web项目后, 我们该怎样将项目部署到 Linux 系统中呢? 本文就来简单讲解一下. 文章已部署本人的博客系统代码展开讲解. 关注收藏, 开始学…

【Spring】SpringBoot的扩展点之ApplicationContextInitializer

简介 其实spring启动步骤中最早可以进行扩展的是实现ApplicationContextInitializer接口。来看看这个接口的注释。 package org.springframework.context;/*** Callback interface for initializing a Spring {link ConfigurableApplicationContext}* prior to being {linkpl…

ChatGPT规模化服务的经验与教训

2022年11月30日&#xff0c;OpenAI发布ChatGPT&#xff0c;以很多人未曾预料的速度迅速走红。与此同时&#xff0c;由于短时间内用户量的暴涨&#xff0c;导致服务器过载&#xff0c;迫使OpenAI停止新用户的注册。 ChatGPT发布这一年&#xff0c;同样的情景发生了好几次。在最近…

暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

RPA暖阳脚本 近日&#xff0c;来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation&#xff08;APA&#xff09;&#xff0c;结合大模型智能体帮助人类进行工作流构建&#x…

微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)

目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties …

ABAP调用Https接口 Ssl证书导入

ABAP调用Https接口 Ssl证书导入 一、证书导入 谷歌浏览器打开对方系统URL地址&#xff0c;下载SSL Server certificate,步骤如下&#xff1a; 浏览器打开要导出certificate(证书)的网站&#xff0c;点击这个小锁的图标&#xff1a; 点击连接是安全的后面小播放按钮 点击证…