C中的运算符优先级和结合性 *p++
优先级和结合性
优先级是用来标识运算符在表达式中的运算顺序的,在求解表达式的值的时候,总是先按运算符的优先次序由高到低进行操作。但是,当一个运算对象两侧的运算符的优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。
结合性是指同一优先级的运算符在表达式中操作的组织方向,即:当一个运算对象两侧的运算符的优先级别相同时,运算对象与运算符的结合顺序。
最容易搞混的莫过于运算符优先级处于第二级别的了,尤其是当 *
和 ++
用在一起时:
先安插一个知识点:自增(++)与自减(- -)运算符只能作用于变量,不能作用于常量和表达式。
*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++相关推荐
- C语言运算符优先级和结合性
C语言运算符优先级和结合性 优先级 运算符 含义 使用形式 结合性 操作数 1 [ ] 数组下标 数组名[整型表达式] 左结合性 ( ) 圆括号 (表达式) . 成员选择(对象) 对象.成员名 -&g ...
- Python运算符优先级与结合性
Python运算符优先级与结合性 优先级和结合性是 Python 表达式中比较重要的两个概念,它们决定了先执行表达式中的哪一部分. Python 运算符优先级 所谓优先级,就是当多个运算符同时出现在一 ...
- c语言运算符优先级结合,C语言运算符优先级及结合性
今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...
- C语言运算符优先级及结合性
今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...
- C语言运算符的优先级和结合性方面的试题,C语言运算符优先级与结合性一览表.docx...
C语言运算符优先级和结合性一览表 所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁.事实上在编程的时候也不需要考虑优先级的问题.因为如果不知道优先级高低的话,加一个括号就可以了,因为括号 ...
- c语言中赋值的时候顿号的作用,简单总结C语言中的运算符优先级
简单总结C语言中的运算符优先级 C语言中有很多运算符,除了四则运算,还有位运算.比较运算.逻辑运算.赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼.通常建议在写代码的时候不用省略括号,但是并不是所 ...
- C/C++中的运算符优先级总结
C语言中的运算符 说明 运算符 结合性 初等运算符 () [] -> . -> 单目运算符 ! ~ ++ -- - (类型) * & sizeof <- 算术运算符 * / ...
- c语言运算符优先级以及结合性
目录 前言 一.运算符是什么? 定义: 分类: 优先级: 几目运算符: 二.运算符的优先级表 前言 做题的时候总是忘记运算符的优先级和结合性,导致在计算表达式值的时候犹豫不定,所以特别记录一下,忘记的 ...
- lodash源码分析之baseFindIndex中的运算符优先级
我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...
最新文章
- 关于字符串计算size的方法比较
- EDM营销内容撰写要注意的几个方面
- mysql读写分离实例_SpringBoot+MyBatis+MySQL读写分离(实例)
- Jvisualvm--JAVA性能分析工具
- 使用static代码块实现线程安全的单例设计模式
- 干活的不如写ppt的吗_干活的干不过写PPT的?或许只是工作汇报的方式错了……...
- Git基础教程(四)
- 支持“***Context”上下文的模型已在数据库创建后发生更改
- 电信网关-天翼网关-GPON-HS8145C设置桥接路由拨号认证
- k2路由器linux系统,告别后门:斐讯K2路由器刷入华硕固件
- linux引导文件制作U盘,Linux下制作U盘系统启动盘的方法
- Yii中处理前后台登录新方法 | 饭饭博客
- redis之db(数据库)
- 【2023电赛备赛】使用sysconfig对ccs进行图形化编程
- java vm art 2.1.0_ART Runtime 创建(二)--启动参数
- 企业门户网站前后台开发——油画商城
- 如何计算一个网段的子网掩码,网络ID,广播地址和可用IP地址数
- PPTV数据按照小类别分类
- matlab 中实现读取图像上点坐标并在图片上标记点和将坐标显示出来
- 怎么刷网站关键词流量​?
热门文章
- ES6 class 技术点拾遗
- elasticsearch restful api操作使用指南
- Gobblin编译支持CDH5.4.0
- sql实现对多个条件分组排序方法和区别
- arcgis_SDE安装步骤
- SQL SERVER 只有MDF文件的恢复
- php删除数组中的空行,php处理文件的思考(去除空行、每行多余字符)
- 基础编程题目集 7-4 BCD解密 (10 分)
- mysql水平拆分 hash_常用的数据库表水平拆分方案
- pca主成分分析结果解释_主成分分析(PCA)原理精讲 | 统计学专题