完结篇:操作符详解(2)
目录
一、单目操作符
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语言中的操作符都讲完了。
完结篇:操作符详解(2)相关推荐
- C语言学习笔记—P13(操作符详解<1>+图解+题例)
目录 前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! --By 作者:新晓·故知 操作符详解<1>: 题例: 1. 操作符分类: 算术操作符 移位操作 ...
- Nginx正则表达式之匹配操作符详解
2019独角兽企业重金招聘Python工程师标准>>> Nginx正则表达式之匹配操作符详解 nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewri ...
- 机器学习第五篇:详解决策树-CART算法
01|前言: 本篇接着上一篇决策树详解,CART是英文"classification and regression tree"的缩写,翻译过来是分类与回归树,与前面说到的ID3.C ...
- 2篇CIKM详解阿里妈妈搜索广告CTR模型如何低碳瘦身
作为<阿里妈妈搜索广告CTR模型的"瘦身"之路>的姊妹篇,本文将结合团队发表的 CIKM 2021 两篇论文,详解我们在模型瘦身之路上的延续性思考与实践.姊妹篇已经总结 ...
- java提高篇之详解内部类
转载自 java提高篇之详解内部类 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无 ...
- 【高级篇】详解Zookeeper客户端Curator
一.序言 之前分享过一篇关于Curotor的基本应用[基础篇]详解Zookeeper客户端Curator,如果对Curator没有了解的可以看看,本文分享关于Curator的一些高级特性,在监听和le ...
- Maven第3篇:详解maven解决依赖问题
Maven第3篇:详解maven解决依赖问题 本文主要内容 感受一下maven的效果 maven约定配置 maven中pom文件 maven坐标详解 maven依赖导入功能 maven依赖范围详解 m ...
- 【基础篇】详解Zookeeper客户端Curator
一.前言 Zookeeper被广泛应用于分布式环境下各种应用程序的协调,而Curator无疑是Zookeeper客户端中的瑞士军刀,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重 ...
- Mysql高手系列 - 第8篇:详解排序和分页(order by limit),及存在的坑
这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...
最新文章
- 节点身份认证(1)DID(Decentralized Identity)系统
- DCMTK:C ++字符串类OFString的测试程序
- html同时执行多个ajax,Ajax方法详解以及多个Ajax并发执行
- Kali Linux 网络扫描秘籍 第四章 指纹识别(三)
- nginx离线安装_做一个属于自己的离线下载服务器原来这么简单
- android 动态contextmenu,Context-Menu.Android
- UVA10344 23 out of 5【暴力+DFS】
- [leetcode]529. 扫雷游戏 DFS递归、BFS、DFS栈实现
- 【iOS】获取应用程序本地路径
- js基础知识汇总13
- 计算机快捷键屏幕录制,电脑录屏快捷键是哪个(电脑录屏的方法有4种)
- gliffy 绘图软件
- Android开发——小技巧(二)修改APP图标和名字
- 更新啦~人生重开模拟器自制
- 图解 FAT 文件系统之基础知识(一)
- [培养锻炼能力][耳机]耳机线断裂维修经验
- oracle创建数据库的先决条件,Oracle数据库安装先决条件检查失败解决方案
- HttpClient Utils工具类的编写方法分享
- 本地phpstudy设置访问浏览器打不开localhost解决方法
- SqlServer更改字段类型--varchar转decimal