整片文章分为三个部分,分别是:

  1. 对于理解所提问题必须清楚的3个关键点;
  2. 对3个关键点的理解;
  3. 对于所提问题的案例解释。

1、对于理解所提问题必须清楚的3个关键点:

解决题目所提的问题之前,必须要明确以下几点,它们是用来区分上述几个例子的关键:

  1. 前置++(即++p),后置++(即p++),*,()等4个运算符优先级
  2. 优先级相同情况下的结合性
  3. 前置++和后置++的运算结果

其中,第三点又是这三个关键点中最关键的,特别在帮助大家理解含有前置++和后置++的复杂表达式的时候。


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的区别相关推荐

  1. 【看完必会系列】不会编程如何实现app自动化之二(自动启动快手app)

    上一篇介绍了冰狐智能辅助的基础知识和准备工作,本篇将以"快手极速版"app自动化作为例子详细讲解不会编程如何使用冰狐智能辅助的「自动构建」功能来完成app自动化. 准备工作 下载并 ...

  2. Android _《看完不忘系列》之Retrofit,android面试题及答案2019

    //运行期生成一个实现WanApi接口的类(字节码),并反射创建其实例 WanApi wanApi = retrofit.create(WanApi.class); //得到Retrofit的call ...

  3. 平安京s9服务器维护,平安京S9的细节改动,看完必上分

    原标题:平安京S9的细节改动,看完必上分 就在前几天,决战平安京迎来了S9赛季,同时也迎来了巨大的改动.下面就由小编来带领大家解读S9. 首先,是我们的经济和经验来源兵线和野怪的改动,野怪血量增加了, ...

  4. UCOSII 信号量和互斥信号量(保姆级别讲解)----看完不后悔系列!!!

    UCOSII 任务的同步与通信状态(保姆级别讲解)----看完不后悔系列!!! 添加链接描述 在前一篇文章基础背景下,我们为了解决对共享资源访问出现线程冲突的问题,引入了几个概念,分别是计数型信号量和 ...

  5. 00018计算机应用基础怎样过,自学考试公共课00018计算机应用基础(看完必过).doc...

    Page PAGE1 of NUMPAGES34. 自考公共课00018 计算机应用基础(看完必过) 计算机应用基础精髓总结 第1章计算机基础知识 1.计算机的发展和应用[选择](06年下1)计算机发 ...

  6. 自考计算机基础00018难吗,自考公共课00018-计算机应用基础(看完必过).doc

    自考公共课00018 计算机使用基础(看完必过) 计算机使用基础精髓总结 第1章计算机基础知识 1.计算机的发展和使用[选择](06年下1)计算机发展阶段是按照计算机硬件来划分的,大致可分为四个阶段: ...

  7. keil5的安装详解(看完必会,不会你打我)

    如何安装KEIL5 本内容所涉及的软件只供教学使用,不得用于商业用途.个人或公司因商业用途导致的法律责任,后果自负. 温馨提示 1.安装路径不能带中文,必须是英文路径 2.安装目录不能跟51的KEIL ...

  8. 认真看完就会系列——CentOS常用命令

    文章目录 一.概述及环境搭建 二.常用的基本命令(必掌握) 目录管理 基本属性 文件内容查看 三.Vim编辑器使用及账号用户管理 账号管理 用户组管理 磁盘管理 四.三种软件安装方式及服务器基本环境搭 ...

  9. 14年的面试官经验分享,看完必有收获

    面试,是找到好工作的过程中,最最重要的一环. 在我14年的职业生涯中,亲自面试的人应该不下1000人了. 看过的简历还要更多,尤其是微软上海早期扩张的时候. 所以今天,我就从自身经历出发,给你分享一些 ...

最新文章

  1. Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS=-Xms9g -Xmx9g...
  2. python之np.var()函数解析
  3. amd一键超频怎么用_头条信息流“一键起量”工具怎么用?经验分享
  4. 一天学完spark的Scala基础语法教程十、类和对象(idea版本)
  5. mac brew 安装php扩展报错:parent directory is world writable but not sticky
  6. 发表和编辑Post的一个Bug
  7. 【标签组件与图标 3.3】
  8. Liunx之nginx代理
  9. 解析JavaScript模拟事件的注意要点
  10. 商城项目数据库设计中订单表
  11. 关于NuDaqPci 数据采集
  12. Pentaho相关组件下载,sourceforget加速
  13. PostgreSQL B+树索引---页面删除
  14. 区块链革命 - 第1篇 假如需要变革 - 第2章 区块链经济七大设计原则
  15. 在配置kile5 的时候出现core.o的错误如何解决
  16. python mysql 并发_python3.6使用sqlalchemy读取mysql中的数据并进行多进程并发处理
  17. 2020年的量子高光时刻
  18. 洛谷P3964松鼠聚会
  19. 改变程序黑窗口的背景和字体颜色
  20. zhs16gbk对应mysql_字符集为ZHS16GBK的数据库导入到字符集为AL32UTF8的数据库

热门文章

  1. 静态时序分析 第六章 串扰和噪声
  2. NC65【新】功能快速开发详细教程(yyds神)
  3. 解读YugaLabs Deck到底是什么?他的目的是什么?
  4. 解决firefox总是弹出需要验证的问题
  5. 分享一组制作游戏用的人物立绘/角色形象素材图片,共182张图片
  6. R语言函数定义快速查看
  7. location.hash 原生js页面跳转/路由
  8. 导出浏览器cookie
  9. 爱心代码李峋同款爱心 python html
  10. STM32开源代码——光敏传感器