[C]表达式结合规律和运算符优先级
表达式结合规律
如果运算符具有相同的优先级(precedence)有些表达式的结合方式是从左往右,有些则是从右往左结合的(例如赋值运算符):
| 表达式 | 结合律 | 组合方式 |
| a/b%c | 从左往右 | (a/b)%c |
| a=b=c | 从右往左 | a=(b=c) |
运算符优先级
| 优先级 | 运算符分类 | 运算符 | 表达式实例 | 结合律 |
| 1 | 前序运算符 | []、()、++、--、(类型名){列表} | arr[2]、x++、&(struct Pair){ 1000L, "New York JFK airport" } | 从左往右 |
| 2 | 一元运算符 | ++、--、!、~、+、-、*、&、sizeof | ++x、!x、*ptr | 从右往左 |
| 3 | 类型转换运算符 | (类型名称) | (void*)ptr | |
| 4 | 乘除法运算 | *、/、% | x * y % z | 从左往右 |
| 5 | 加减法运算 | +、- | x + y | |
| 6 | 位移运算符 | <<、>> | x << 6 | |
| 7 | 关系运算符 | <、<=、>、>= | x < y | |
| 8 | 相等运算符 | ==、!= | x == y | |
| 9 | 位运算符AND | & | x & y | |
| 10 | 位运算符XOR | ^ | x ^ y | |
| 11 | 位运算符OR | | | x | y | |
| 12 | 逻辑运算符AND | && | x && y | |
| 13 | 逻辑运算符OR | || | x || y | |
| 14 | 条件运算符 | ?: | x?1:2 | 从右往左 |
| 15 | 赋值运算符 | =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= | x += 1 | |
| 16 | 逗号运算符 | , | 从左往右 |
除了一元运算符、类型转换运算符、条件运算符、赋值运算符是从右往左结合以外,其他都是从左往右结合的;
例如,*++ptr,等同于*(++ptr),当中括号是没必要的,因为*和前置递增的运算符是同一级别的,并且它的结合律是从右往左;
来看看这个示例:
#include <stdio.h>
int arr[] = {, , };
int main(void)
{
int* ptr = arr;
int x = * *++ptr;
printf("%d\n", x);
return ;
}
尝试先自己算算x得出的什么结果;
表达式(2 * *++ptr)中,由于间接运算符比乘法运算符优先级要高,所以它会先执行间接运算符;
但是由于间接运算符后面还接前置递增号,因为两者的优先级是一样的,所以结合律起作用了;
子表达式(*++ptr)从右往左运算,得出的值是arr元素8;
再运行2 * 8,结果是16;
你算对了吗?
[C]表达式结合规律和运算符优先级的更多相关文章
- man手册查找ascii码和运算符优先级
1.man手册可以输出ascii码表 man ascii 2.man手册还可以输出运算符的优先级 man operator
- JavaScript深入浅出补充——(一)数据类型,表达式和运算符
项目基本做完,在进行下一阶段学习之前先看视频学习回顾一下JavaScript 一.数据类型 JavaScript中有五种原始类型和一种对象类型 JavaScript弱类型语言中隐式转换 num-0 字 ...
- C#图解教程 第八章 表达式和运算符
表达式和运算符 表达式字面量 整数字面量实数字面量字符字面量字符串字面量 求值顺序 优先级结合性 简单算术运算符求余运算符关系比较运算符和相等比较运算符递增运算符和递减运算符条件逻辑运算符逻辑运算符移 ...
- 笔记《JavaScript 权威指南》(第6版) 分条知识点概要3—表达式和运算符
[表达式和运算符]原始表达式,初始化表达式(对象和数组的),函数定义表达式,属性访问表达式,调用表达式,对象创建表达式,运算符概述,算术表达式,关系表达式,逻辑表达式,赋值表达式,表达式计算,其他运算 ...
- Python --表达式和运算符
表达式 由一个或者几个数字或者变量和运算符组合成的一行代码 通常会返回一个结果 运算符 由一个以上的值经过变化得到新值的过程就叫做运算 用于运算的符号称为运算符 运算符的分类: 算数运算符 比较或者关 ...
- Python基础0:变量 赋值 表达式和运算符
变量: 前面我们在使用print()输出内容的时候,如果内容很长,后面要再次输出的时候,就需重新在输入一遍. 如果给输出的内容起个简单的别名.这样我们用简短的别名来代替长内容,下次要输出的时候就直接使 ...
- Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句
第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...
- 编写可维护的JavaScript—语句和表达式&变量、函数和运算符
语句和表达式 所有的块语句都应当使用花括号.包括: if for while do…while… try…catch…finally //不好的写法 if (condition) doSomethin ...
- Javascript学习2 - Javascript中的表达式和运算符
原文:Javascript学习2 - Javascript中的表达式和运算符 Javascript中的运算符与C/C++中的运算符相似,但有几处不同的地方,相对于C/C++,也增加了几个不同的运算符, ...
随机推荐
- 自然语言处理(NLP) - 数学基础(1) - 排列组合
正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先 ...
- 第一节知识点:.net与c#的概念
1.什么是.net .net一般指的是.NET Framework框架,一种平台,一种技术:.NET 是微软的新一代技术平台,以构建互联互通的应用系统.这些应用程序的开发和运行必须有 ...
- MDS 多活配置
CephFS 介绍及使用经验分享 阅读 1179 收藏 2 2019-01-14 原文链接:www.jianshu.com WebRTC SFU中发送数据包的丢失反馈juejin.im 目录 Ceph ...
- CC1605&CC1604 usb3.0+FPGA 高速视频采集 双目相机测评
CC1605&CC1604 usb3.0+FPGA 高速视频采集 双目相机测评 摄像头配置:ov5640.OV5642.mt9p031.mt9m001c12stm OV5640 xclk:24 ...
- DENEBOLA (See3CAM_CX3RDK) - CX3 Reference Design
Denebola (See3CAM_CX3RDK) is a USB3.0 USB video class (UVC) reference design kit (RDK) developed by ...
- linux-iptables增、删、改、保存
iptables基础: iptables的5条链分别是: prerouting 路由前 input 发到本机进程的报文 ouput 本机某进程发出的报文 forword 转发 postrouting ...
- 201871010119-帖佼佼《面向对象程序设计(java)》第十三周学习总结
博客正文开头格式: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nw ...
- 201871010119-帖佼佼《面向对象程序设计(java)》第六—七周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- Node6-2单元测试 覆盖率Istanbul
Step1:安装Istanbul npm install -g istanbul Step2:在package.json里面添加,具体参考Istanbul的API写法 "scripts&qu ...
- SpringCloud基础组件总结,与Dubbo框架、SpringBoot框架对比分析
本文源码:GitHub·点这里 || GitEE·点这里 一.基础组件总结 1.文章阅读目录 1).基础组件 Eureka组件,服务注册与发现 Ribbon和Feign组件,实现负载均衡 Hystri ...