优先级和结合性

优先级是用来标识运算符在表达式中的运算顺序的,在求解表达式的值的时候,总是先按运算符的优先次序由高到低进行操作。但是,当一个运算对象两侧的运算符的优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。

结合性是指同一优先级的运算符在表达式中操作的组织方向,即:当一个运算对象两侧的运算符的优先级别相同时,运算对象与运算符的结合顺序。

最容易搞混的莫过于运算符优先级处于第二级别的了,尤其是当 *++ 用在一起时:

先安插一个知识点:自增(++)与自减(- -)运算符只能作用于变量,不能作用于常量和表达式

*p++ 和 ++*p

#include <iostream>
using namespace std;int main(int argc, char *argv[]) {const char *p = "hello";cout << *p << endl;cout << *p++ << endl;cout << *++p << endl;//cout << ++*p << endl; // 编译报错,*p 为一个字符,++ 不能作用于常量和表达式int a = 6;int *pa = &a;cout << *pa++ << endl;cout << ++*pa << endl;return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

gcc 7.3.0 中的输出结果为:

h
h
l
6
-1268913224

下面一一解读上面的输出结果,首先是第一行输出的 h,这个不用多说,*p 的作用就是取出字符串常量中的第一个字符。

*p++ ,由于 * (取值运算符)和 ++ (自增运算符)同属第二优先级别的运算符,所以当它们同时作用于变量 p 上时,按照从右向左的结合顺序依次进行运算。所以 *p++ 等同于 *(p++)

  • 第一步 :执行 p++,执行完后,p 的值增加 1(此时 p 已经指向第二个字符),并且返回 p 增加前的值。
  • 第二步:执行 *(p++),灰色表示已经执行完了,而表达式 (p++) 的值为原始 p 的值,即还是指向字符串常量第一个字符的地址,所以最终结果为:h

*++p,按照从右向左结合的顺序,等价于 *(++p),先执行 ++p ,执行完后,p 指向第三个字符,即 l,并且表达式 (++p) 返回 p 增加后的值,所以最终结果为 l

类似的,*pa++等价于 *(pa++),执行完的结果是:表达式值为 6(通过这个结果可以证明:* 取值运算符作用的是 (pa++)表达式,而不是作用于变量 pa 本身),pa 值增加1,指向一个未知内存。当执行 ++*pa 时,由于 pa 此时指向的位置未知,所以对其里面的内容进行自增运算的结果也未知,所以最终的结果为一个垃圾数。

参考:
[1] c语言运算符优先级,结合性(左/右结合详解)
[2] C语言运算符的结合性详细分析

C中的运算符优先级和结合性 *p++相关推荐

  1. C语言运算符优先级和结合性

    C语言运算符优先级和结合性 优先级 运算符 含义 使用形式 结合性 操作数 1 [ ] 数组下标 数组名[整型表达式] 左结合性 ( ) 圆括号 (表达式) . 成员选择(对象) 对象.成员名 -&g ...

  2. Python运算符优先级与结合性

    Python运算符优先级与结合性 优先级和结合性是 Python 表达式中比较重要的两个概念,它们决定了先执行表达式中的哪一部分. Python 运算符优先级 所谓优先级,就是当多个运算符同时出现在一 ...

  3. c语言运算符优先级结合,C语言运算符优先级及结合性

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

  4. C语言运算符优先级及结合性

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

  5. C语言运算符的优先级和结合性方面的试题,C语言运算符优先级与结合性一览表.docx...

    C语言运算符优先级和结合性一览表 所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁.事实上在编程的时候也不需要考虑优先级的问题.因为如果不知道优先级高低的话,加一个括号就可以了,因为括号 ...

  6. c语言中赋值的时候顿号的作用,简单总结C语言中的运算符优先级

    简单总结C语言中的运算符优先级 C语言中有很多运算符,除了四则运算,还有位运算.比较运算.逻辑运算.赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼.通常建议在写代码的时候不用省略括号,但是并不是所 ...

  7. C/C++中的运算符优先级总结

    C语言中的运算符 说明 运算符 结合性 初等运算符 () [] -> . -> 单目运算符 ! ~ ++ -- - (类型) * & sizeof <- 算术运算符 * / ...

  8. c语言运算符优先级以及结合性

    目录 前言 一.运算符是什么? 定义: 分类: 优先级: 几目运算符: 二.运算符的优先级表 前言 做题的时候总是忘记运算符的优先级和结合性,导致在计算表达式值的时候犹豫不定,所以特别记录一下,忘记的 ...

  9. lodash源码分析之baseFindIndex中的运算符优先级

    我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...

最新文章

  1. 关于字符串计算size的方法比较
  2. EDM营销内容撰写要注意的几个方面
  3. mysql读写分离实例_SpringBoot+MyBatis+MySQL读写分离(实例)
  4. Jvisualvm--JAVA性能分析工具
  5. 使用static代码块实现线程安全的单例设计模式
  6. 干活的不如写ppt的吗_干活的干不过写PPT的?或许只是工作汇报的方式错了……...
  7. Git基础教程(四)
  8. 支持“***Context”上下文的模型已在数据库创建后发生更改
  9. 电信网关-天翼网关-GPON-HS8145C设置桥接路由拨号认证
  10. k2路由器linux系统,告别后门:斐讯K2路由器刷入华硕固件
  11. linux引导文件制作U盘,Linux下制作U盘系统启动盘的方法
  12. Yii中处理前后台登录新方法 | 饭饭博客
  13. redis之db(数据库)
  14. 【2023电赛备赛】使用sysconfig对ccs进行图形化编程
  15. java vm art 2.1.0_ART Runtime 创建(二)--启动参数
  16. 企业门户网站前后台开发——油画商城
  17. 如何计算一个网段的子网掩码,网络ID,广播地址和可用IP地址数
  18. PPTV数据按照小类别分类
  19. matlab 中实现读取图像上点坐标并在图片上标记点和将坐标显示出来
  20. 怎么刷网站关键词流量​?

热门文章

  1. ES6 class 技术点拾遗
  2. elasticsearch restful api操作使用指南
  3. Gobblin编译支持CDH5.4.0
  4. sql实现对多个条件分组排序方法和区别
  5. arcgis_SDE安装步骤
  6. SQL SERVER 只有MDF文件的恢复
  7. php删除数组中的空行,php处理文件的思考(去除空行、每行多余字符)
  8. 基础编程题目集 7-4 BCD解密 (10 分)
  9. mysql水平拆分 hash_常用的数据库表水平拆分方案
  10. pca主成分分析结果解释_主成分分析(PCA)原理精讲 | 统计学专题