【看完必会系列】*p++、*(p++)、(*p)++、*++p、++*p的区别
整片文章分为三个部分,分别是:
- 对于理解所提问题必须清楚的3个关键点;
- 对3个关键点的理解;
- 对于所提问题的案例解释。
1、对于理解所提问题必须清楚的3个关键点:
解决题目所提的问题之前,必须要明确以下几点,它们是用来区分上述几个例子的关键:
- 前置++(即++p),后置++(即p++),*,()等4个运算符优先级
- 优先级相同情况下的结合性
- 前置++和后置++的运算结果
其中,第三点又是这三个关键点中最关键的,特别在帮助大家理解含有前置++和后置++的复杂表达式的时候。
2、对3个关键点的理解:
1、优先级:
()> 后置++ > 前置++和*
(网上有很多文章把前置++和后置++优先级混为一谈,这是不准确的哦)
2、结合性:
结合性的讨论是建立在同一优先级的,也就是说,只有在优先级相同的情况下,我们才讨论结合性,它决定了运算符的匹配方式。
举例:
赋值运算符+=和-=处于同一优先级,结合方向是自右向左,那么7+=3-=2;运算顺序就是先算3-=2,结果为1,然后再算7+=1,结果为8。
3、++p的运算结果是什么?p++的运算结果又是什么?
++p:先对p做一次自增,再使用p的值;
p++:先使用p的值,再对p做一次自增。
(很多朋友在这里是比较困惑的,对于++p或者p++这样的表达式,它们的结果到底是什么?比如p++,我们刚说了先使用p的值,又说了对p再做一次自增,那么对于表达式来说到底用哪一次的值呢?通过刚才的解释,我们只需要记住:在基于对这两个表达式的意思已经理解的情况下,表达式的整个结果是对p“使用”时的值,注意上方红字部分,表示此时的p值即为表达式结果。在这里,我们一定要区分表达式的结果和p的结果,他们是不一样的。)
举例:
p=3;
++p:先对p做一次自增(p为3+1=4),再使用p的值(p==4)。表达式的值为4。
p++:先使用p的值(p为3),再对p做一次自增(p为3+1,即4)。表达式的值为3。
3、对于所提问题的案例解释:
如果大家对于上述三点已经比较清楚了,那么我们就可以开始接下来的分析了:
为了便于理解,我们有如下假设:
p指向地址为0x00的内存,里面存了整型2,0x04地址里存了整型3。
*p++:
先分析优先级:后置++优先级高于*,所以先计算p++。(在这里给大家介绍一种分析方法,此时我们可以把p++看作*p++的一个子表达式,那么原表达式可以表示为*(p++),如果我们得出了p++这个表达式的结果为x,那么原表达式又可以表示为*x。通过子表达式这样的方式,是不是就会清晰了很多呢?)p++根据之前的介绍,先使用p的值,再自增1,其结果为使用时的值,即0x00这个地址,即p++整个表达式的值为0x00。所以*(p++)即为*(0x00),对0x00这个地址解引用拿到内存中存取的值为2;
*(p++):
这个例子因为括号的原因,先计算括号内表达式,后续同上。
(*p)++:
先分析优先级,右括号,先计算括号内,即先计算(*p)得到x,再计算x++。*p对p指向的地址解引用拿到内存中存放的2,即x的值为2,2++得到3,最终整个表达式结果为3;
*++p:
先讨论优先级,*和前置++优先级一样,则讨论结合性,两者结合性均为从右向左,所以++p先计算得到x,再计算*x。++p是对p自身做自增,地址+1,得到0x04的地址,即x的值为0x04,再*x解引用,拿到0x04地址中存放的内容,即3。最终整个表达式的值为3;
++*p:
先讨论优先级,*和前置++优先级一样,则讨论结合性,两者结合性均为从右向左,所以先计算*p得到x,再计算++x。*p对p指向的地址解引用,得到存放的2,再计算++2,得到整个表达式的值为3。
上述解释中,有一个很重要的技巧就是把一个较复杂的表达式,拆分为若干个子表达式,这样通过每一个子表达式计算的结果来计算整个表达式就会简单、清晰很多。
【看完必会系列】*p++、*(p++)、(*p)++、*++p、++*p的区别相关推荐
- 【看完必会系列】不会编程如何实现app自动化之二(自动启动快手app)
上一篇介绍了冰狐智能辅助的基础知识和准备工作,本篇将以"快手极速版"app自动化作为例子详细讲解不会编程如何使用冰狐智能辅助的「自动构建」功能来完成app自动化. 准备工作 下载并 ...
- Android _《看完不忘系列》之Retrofit,android面试题及答案2019
//运行期生成一个实现WanApi接口的类(字节码),并反射创建其实例 WanApi wanApi = retrofit.create(WanApi.class); //得到Retrofit的call ...
- 平安京s9服务器维护,平安京S9的细节改动,看完必上分
原标题:平安京S9的细节改动,看完必上分 就在前几天,决战平安京迎来了S9赛季,同时也迎来了巨大的改动.下面就由小编来带领大家解读S9. 首先,是我们的经济和经验来源兵线和野怪的改动,野怪血量增加了, ...
- UCOSII 信号量和互斥信号量(保姆级别讲解)----看完不后悔系列!!!
UCOSII 任务的同步与通信状态(保姆级别讲解)----看完不后悔系列!!! 添加链接描述 在前一篇文章基础背景下,我们为了解决对共享资源访问出现线程冲突的问题,引入了几个概念,分别是计数型信号量和 ...
- 00018计算机应用基础怎样过,自学考试公共课00018计算机应用基础(看完必过).doc...
Page PAGE1 of NUMPAGES34. 自考公共课00018 计算机应用基础(看完必过) 计算机应用基础精髓总结 第1章计算机基础知识 1.计算机的发展和应用[选择](06年下1)计算机发 ...
- 自考计算机基础00018难吗,自考公共课00018-计算机应用基础(看完必过).doc
自考公共课00018 计算机使用基础(看完必过) 计算机使用基础精髓总结 第1章计算机基础知识 1.计算机的发展和使用[选择](06年下1)计算机发展阶段是按照计算机硬件来划分的,大致可分为四个阶段: ...
- keil5的安装详解(看完必会,不会你打我)
如何安装KEIL5 本内容所涉及的软件只供教学使用,不得用于商业用途.个人或公司因商业用途导致的法律责任,后果自负. 温馨提示 1.安装路径不能带中文,必须是英文路径 2.安装目录不能跟51的KEIL ...
- 认真看完就会系列——CentOS常用命令
文章目录 一.概述及环境搭建 二.常用的基本命令(必掌握) 目录管理 基本属性 文件内容查看 三.Vim编辑器使用及账号用户管理 账号管理 用户组管理 磁盘管理 四.三种软件安装方式及服务器基本环境搭 ...
- 14年的面试官经验分享,看完必有收获
面试,是找到好工作的过程中,最最重要的一环. 在我14年的职业生涯中,亲自面试的人应该不下1000人了. 看过的简历还要更多,尤其是微软上海早期扩张的时候. 所以今天,我就从自身经历出发,给你分享一些 ...
最新文章
- Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS=-Xms9g -Xmx9g...
- python之np.var()函数解析
- amd一键超频怎么用_头条信息流“一键起量”工具怎么用?经验分享
- 一天学完spark的Scala基础语法教程十、类和对象(idea版本)
- mac brew 安装php扩展报错:parent directory is world writable but not sticky
- 发表和编辑Post的一个Bug
- 【标签组件与图标 3.3】
- Liunx之nginx代理
- 解析JavaScript模拟事件的注意要点
- 商城项目数据库设计中订单表
- 关于NuDaqPci 数据采集
- Pentaho相关组件下载,sourceforget加速
- PostgreSQL B+树索引---页面删除
- 区块链革命 - 第1篇 假如需要变革 - 第2章 区块链经济七大设计原则
- 在配置kile5 的时候出现core.o的错误如何解决
- python mysql 并发_python3.6使用sqlalchemy读取mysql中的数据并进行多进程并发处理
- 2020年的量子高光时刻
- 洛谷P3964松鼠聚会
- 改变程序黑窗口的背景和字体颜色
- zhs16gbk对应mysql_字符集为ZHS16GBK的数据库导入到字符集为AL32UTF8的数据库