完结篇:操作符详解(2)

news2024/11/23 22:29:44

目录

一、单目操作符

                1、!  逻辑反操作

                            补充:布尔类型

                2、& 取地址操作符

                3、* 间接访问操作符(解引用操作符)

                4、sizeof 计算操作数的类型长度

                5、~ 操作符

                        操作符的结合使用

                6、++操作符(前置/后置)

                7、--操作符(前置/后置)

                8、(类型)    强制类型转换

二、关系操作符

三、逻辑操作符

                逻辑操作符经典例题

四、条件操作符(三目操作符)

五、逗号表达式

六、下标引用、函数调用和结构成员

                1、下标引用操作符  [ ]

                 2、函数调用操作符 ( )

                 3、访问一个结构体的成员


一、单目操作符

单目操作符介绍

!            逻辑反操作   

-            负值

+           正值

&           取地址

sizeof    操作数的类型长度(以字节为单位)

~           对一个数的二进制按位取反

--           前置--、后置--

++         前置++、后置++

*            间接访问操作符(解引用操作符)

(类型)    强制类型转换

1、!  逻辑反操作

真变假,假变真。

 


补充:布尔类型

• 布尔类型(_Bool/bool)就是用来表示真假的类型。

• 布尔类型只有两种取值:true 、 false


 2、& 取地址操作符

取地址操作符一般都是对一个变量取地址。

#include <stdio.h>
int main()
{
	int a = 10;
	printf("%p\n", &a);//取出变量a的地址
	int* pc = &a; //取出a的地址并存放在指针变量pc中,由于a是int类型,所以pc应该是int*
	
    //类似的,还有字符型
	char ch = 'a';
	char* pc = &ch;

    //数组
	char arr[10] = { 0 };
	char* p2 = arr;    //arr是地址首元素的地址,取出数组首元素的地址
	char* p3 = &arr[0];//同上

	//对于常量字符串而言
	char* p4 = "abcdef";  //取的是a的地址  
	printf("%c", *p4);    //*p4就是a      

	return 0;
}

3、* 间接访问操作符(解引用操作符)

这个操作符是配合&来使用的

 代码解析:首先取出a的地址存放到指针变量pc中,接着对pc前加个*叫做解引用,这时*pc就等价于a。初识C语言--指针篇(5),这篇博客后面也有讲到解引用操作符。

4、sizeof 计算操作数的类型长度

•首先sizeof既是关键词,也是操作符。

•它可以计算变量大小、数组大小、类型大小。

sizeof在计算一个变量名大小时,括号其实是可以省略(这从侧面上还能证明sizeof不是函数,因为在调用函数时,括号是不能省略的),但是计算类型大小时,括号不可以省略。

同样地,sizeof在数组也同样适用

 接着,sizeof在计算中还有其他特点,看看下面的代码

代码解析:很多人想当然以为a+3=13,然后赋给b,最后b的值是13,实际上是错误的,那为什么是错误的呢?原因是sizeof内部的表达式是不参与计算的(a+3赋给b不会发生) 。所以b的值还是一开始的5,而为什么第8行打印的结果是2呢?原因很简单,a是整型占4个字节,而a+3中的3也属于整型,也占4个字节,而b是2个字节,但a+3的结果最终要放到b中,接着整型要存储到短整型会发生截断,所以表达式最终赋值的空间还是b说的算。

5、~ 操作符

  ~ 是对一个数的二进制所有位取反。

举个例子 

 代码解析:a的值为0,所以它的补码是00000000000000000000000000000000,又因为~是对二进制所以位取反,所以就变成11111111111111111111111111111111(补码),最后转换为原码(符号位不变,其他位按位取反,最后+1):10000000000000000000000000000001,最后的结果就是-1。


操作符的结合使用

既然我们学完了&、|、^、>>、<<、~ ,现在就把它们结合起来

在此之前如果没看过操作符(1),最好先看一遍哟

传送门:操作符详解(1)

问题如下:

先上代码,后面解释

代码解释:

那么问题来了,如何将最终目标改回9的二进制位呢?

老样子,先上代码

代码解析:


 6、++操作符(前置/后置)

①后置++

计算规则:先使用,再++

 代码解释:后置++,规则是先使用,则先使用a的值赋给b,所以b=10,接着再++,意思是让a自增1,所以a=11

 ②前置++

计算规则:先++,再使用

代码解析:前置++规则,先++,所以a先自增1,所以a=11,接着再使用,就是将a=11赋给b,所以b=11 

7、--操作符(前置/后置)

-- 前置和后置就不细说了,本质上是和++相同的

--前置:先--,再使用

--后置:先使用,后--

8、(类型)    强制类型转换

举个例子

 3.14是double类型,而a是int类型,但是编辑器就报警了,“初始化”:“double”转化到“int”可能会丢失数据, 为了避免这种情况,只需要对3.14强制类型转换。

  二、关系操作符

>

>=

<=

!=        用于测试“不相等”

==       用于测试“相等”

 这些关系运算符比较简单,没什么可以讲的,但是要注意一些运算符使用时候的陷阱

警告⚠:在编程过程中,不要把==(相等)和=(赋值)写错。

 三、逻辑操作符

&&        逻辑与(并且)

||           逻辑或(或者)

 这里要与按位与(&)和按位或(|)区分:它们是通过二进制计算的

而逻辑与(&&)和逻辑或(||):只关注真假

逻辑与(&&)

•若a和b同时为真

a&&b的结果就为真

•若a和b中至少有一个为假

a&&b的结果就为假

总结:两真为真,一假为假

逻辑或(||)

•若a和b同时为真

a||b的结果就为真

•若a和b其中一个为真

a||b的结果就为真

总结:一真为真,两假才为假

为了让大家更好理解&&和||,举一个生活中的例子,假设a和b是一个女生求偶的条件,比如:a的条件是要有50w,b的条件是帅,对于&&来说,只要有一个不满足要求,女生就不会考虑,而对于||来说,是要有一个满足了,就可以牵手啦。

接下来看看一道经典例题

 代码解析:先看44行代码,它是逻辑与操作符,首先先计算a++,而后置a++是先使用,后++,所以a++的值是0,为假(0为假,非0为真),对于逻辑与操作符,只要有一个为假,后面就没必要看了,但这里要注意的是,不管是前置++(--),还是后置++(--),它们都有副作用,虽然为假,但是a还是会自增1,所以最后a=1,b=2,c=3,d=4

如果把&&换成||,结果又会是如何呢?

代码解析:首先先计算a++,刚刚说过了为假,a自增了1为1,但是这里是逻辑或(||),一个假不能判定整个表达式全假,只有全假才算假,所以后面还要继续算,接下来++b是先计算,后使用,所以b自增1为3(非0为真),注意到这里为止,后面d++就没必要算了,逻辑或只要有一个为真,整个表达式都为真,所以打印结果就为a=1,b=3,c=3,d=4

四、条件操作符(三目操作符)

•exp1 ? exp2 : exp3   exp译为表达式

•若exp1为真,则exp2的结果就是整个表达式的结果,exp3不计算

•若exp1为假,则exp3的结果就是整个表达式的结果,exp2不计算

代码演示

求两个数的最大值

五、逗号表达式

•exp1 , exp2 , exp3 , ...expN 

•逗号表达式,就是逗号隔开的多个表达式

•逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

代码演示

代码解析:首先从左向右依次执行,虽然a>b为假,但不会影响后面的,接着把b+10的值赋给a,则a=12,最后,c的值就是最后b=a+1的值,所以b=12+1=13,也就是说c的值为13

六、下标引用、函数调用和结构成员

1)下标引用操作符  [ ]

操作数:一个数组名 + 索引值

  2)函数调用操作符 ( )

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数是传递给函数的参数。

调用函数求字符串长度

 3)访问一个结构体的成员

• .   结构体 . 成员名     传送门:初识结构体

• ->   结构体指针->成员名   传送门:指针结构体

这里简单总结

假如要定义一本书,所以要有书名、作者、出版社等等

①.    结构体 . 成员名

 ②• ->   结构体指针->成员名 

这里其实还能用到点(.)操作符

到此为止,C语言中的操作符都讲完了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计】19-基于单片机的物件计数控制系统设计(原理图工程+源代码工程+仿真工程+答辩论文)

typora-root-url: ./ 【毕业设计】19-基于单片机的物件计数控制系统设计&#xff08;原理图工程源代码工程仿真工程答辩论文&#xff09; 文章目录typora-root-url: ./【毕业设计】19-基于单片机的物件计数控制系统设计&#xff08;原理图工程源代码工程仿真工程答辩论文&…

【深度学习】pix2pix GAN理论及代码实现与理解

灵感&#xff1a;最近也是在看关于GAN方面的代码&#xff0c;也是看到了很多篇博客&#xff0c;都写的挺好的&#xff0c;让我醍醐灌顶&#xff0c;理解了GAN的原理以及代码实现。所以写一下来记载一下&#xff0c;最后有其他好文章的链接。 灵感来源&#xff1a;pix2pixGAN理…

干货 | 提前在开发阶段暴露代码问题,携程Alchemy代码质量平台

作者简介Lyan&#xff0c;携程资深后端开发工程师&#xff0c;负责自动化测试框架及平台类工具开发&#xff0c;关注Devops、研发效能领域。一、背景随着敏捷开发&#xff0c;DevOps开发模式的流行&#xff0c;代码质量分析作为研发质量保证体系的重要组成部分&#xff0c;不仅…

LVS负载均衡群集--NAT

目录 前言 一、对于lvs负载均衡的了解 1、群集&#xff08;集群&#xff09;的概述 1.1 出现的问题 1.2 解决高并发的方法 2、群集的类型 2.1 负载均衡群集 2.2 高可用群集&#xff08;冗余 单点故障&#xff09; 2.3 高性能运算群集&#xff08;分布式&#xff09; …

【C++面向对象程序设计】CH6 多态性与虚函数

目录 一、多态性的概念 二、一个典型的例子——【例6.1】 1.声明基类point类 2.声明派生类circle ​编辑 3.声明circle的派生类cylinder 三、虚函数 1.虚函数的作用 &#xff08;1&#xff09;派生类的对象可以给基类的对象赋值 &#xff08;2&#xff09;派生类的对象…

mmdetection3d SUN RGB-D数据集预处理

SUN RGB-D是普林斯顿大学发布的一种关于室内场景理解的数据集&#xff0c;共包含了10335个样本&#xff0c;其中训练样本和验证测试样本数量分别为5285和5050。每个样本包含了彩色图像&#xff08;RGB&#xff09;和深度&#xff08;D&#xff09;信息&#xff0c;并且分别进行…

智能微型断路器在道路照明、园区照明、隧道照明中的应用-安科瑞 时丽花

智能微型断路器应用场景 九小场所 商场、超市等购物场所 养老院、福利院、孤儿院等社会福利机构 图书馆、博物馆、科技馆、文化馆等文化活动中心 车站、轨道交通等交通枢纽 易燃易爆仓库、木材加工、纺织、喷涂、制药等企业 酒吧&#xff0c;网吧等娱乐场所 幼儿园、小…

B站视频弹幕不挡住人脸效果

前言 有天在B站看二舅的视频时&#xff0c;密密麻麻的弹幕居然没有二舅的人脸&#xff0c;很好奇是怎么做到的&#xff0c;于是决定一探究竟。 高端的效果&#xff0c;往往只需要采用最朴素的实现方式&#xff0c;琢磨了好一会儿&#xff0c;打开了F12&#xff0c;豁然开朗。…

Quartz深度实战

概述 Java语言中最正统的任务调度框架&#xff0c;几乎是首选。后来和Spring Schedule平分秋色&#xff1b;再后来会被一些轻量级的分布式任务调度平台&#xff0c;如XXL-Job取代。另外近几年Quartz的维护和发布几乎停滞&#xff0c;但这并不意味着Quartz被淘汰&#xff0c;还…

【干货】微信私域运营打法和案例拆解(附78页pdf下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点知识图谱在美团推荐场景中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf&#xff08;附下载链接&#xff09;机器学习在B站推荐系统中的应用实践…

【吴恩达机器学习笔记】七、神经网络

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

数据库设计三范式

数据库设计三范式 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范需要遵循不同的范式&#xff0c;只有充分遵循了数据库设计的范式&#xff0c;才能设计开发出冗余较小、高效、结构合理的数据库。 通常&#xff0c;我们在设计数据库的时候会要求遵循三范式。 第一…

《强化学习周刊》第69期:ICLR2023强化学习论文推荐、MIT实现自动调整内在奖励的强化学习...

No.69智源社区强化学习组强化学习研究观点资源活动周刊订阅告诉大家一个好消息&#xff0c;《强化学习周刊》已经开启“订阅功能”&#xff0c;以后我们会向您自动推送最新版的《强化学习周刊》。订阅方法&#xff1a;方式1&#xff1a;扫描下面二维码&#xff0c;进入《强化学…

使用Python PySNMP模块获取设备指标

一、PySNMP模块介绍&#xff1a; PySNMP 是一个跨平台的纯Python SNMP 引擎实现。它具有功能齐全的 SNMP 引擎&#xff0c;能够充当代理/管理器/代理角色&#xff0c;通过 IPv4/IPv6 和其他网络传输传输 SNMP v1/v2c/v3 协议版本。目前&#xff0c;使用较多的是SNMP v3和v2c版…

Robust Document Image Dewarping Method Using Text-Lines and Line Segments论文学习笔记

1 摘要 传统的基于文本行的文档去扭曲方法在处理复杂布局和/或非常少的文本行时会出现问题。当图像中没有对齐的文本行时&#xff0c;这通常意味着照片、图形和/或表格占据了输入的大部分。因此&#xff0c;对于健壮的文档去扭曲变形&#xff0c;我们建议除了对齐的文本行之外…

Python解题 - CSDN周赛第11期 - 圆桌请客(脑筋急转弯)

本来想着没有all pass就不写题解了&#xff0c;但在赛后对最后一题纠结了好久&#xff0c;然后发现是个类似脑筋急转弯的题&#xff0c;自己与正确答案只差一层纸&#xff0c;实在有点不吐不快。另外本期考了经典的背包问题的模板题&#xff0c;也值得记录下来&#xff0c;加深…

全志科技A40i国产开发板——性能参数综合测试

本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口、双路CAN、双路USB、双路RS485等通信接口,板载Bluetooth、WIFI、4G(选配)模块,同时引出MIPI LCD、LVDS LCD、TFT LCD、HDMI OUT、CVBS OUT、CAMERA、LINE IN、H/P OUT等音视频多媒…

宿主机与开发板网络共享

宿主机网络共享 一、关键步骤 11. 网络共享简介 目标&#xff1a;宿主机可以用ssh连接开发板&#xff0c;开发板可以上网。 步骤&#xff1a;宿主机与目标机用网线直连&#xff0c;宿主机采用IP共享的方式连接开发板&#xff1b; 配置项IP开发板IP192.168.0.232宿主机以太网I…

Java 序列化原理

我的网站 | 我的博客 | 序列化解析工具 概念 Java为我们提供了一种默认的对象序列化机制&#xff0c;通过这种机制可以将一个实例对象写入到IO流中&#xff0c;当然这种IO流可以是文件流、网络流或者其他什么流。 代码的写法 ObjectOutputStream 对象输出流&#xff0c;用…

2022新一代设备维修管理系统助力企业降本增效

设备的维修是指企业或者设备密集型单位为了保持、恢复并提升设备使用寿命而定期对设备进行状态的维护&#xff0c;备件的更换&#xff0c;发生故障后的维修和恢复&#xff0c;从而让设备保证良好的运营状态&#xff0c;提升设备的可利用性并保证产能和设备安全。 大型企业在设…