表达式结合规律

如果运算符具有相同的优先级(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]表达式结合规律和运算符优先级的更多相关文章

  1. man手册查找ascii码和运算符优先级

    1.man手册可以输出ascii码表 man   ascii 2.man手册还可以输出运算符的优先级 man operator

  2. JavaScript深入浅出补充——(一)数据类型,表达式和运算符

    项目基本做完,在进行下一阶段学习之前先看视频学习回顾一下JavaScript 一.数据类型 JavaScript中有五种原始类型和一种对象类型 JavaScript弱类型语言中隐式转换 num-0 字 ...

  3. C#图解教程 第八章 表达式和运算符

    表达式和运算符 表达式字面量 整数字面量实数字面量字符字面量字符串字面量 求值顺序 优先级结合性 简单算术运算符求余运算符关系比较运算符和相等比较运算符递增运算符和递减运算符条件逻辑运算符逻辑运算符移 ...

  4. 笔记《JavaScript 权威指南》(第6版) 分条知识点概要3—表达式和运算符

    [表达式和运算符]原始表达式,初始化表达式(对象和数组的),函数定义表达式,属性访问表达式,调用表达式,对象创建表达式,运算符概述,算术表达式,关系表达式,逻辑表达式,赋值表达式,表达式计算,其他运算 ...

  5. Python --表达式和运算符

    表达式 由一个或者几个数字或者变量和运算符组合成的一行代码 通常会返回一个结果 运算符 由一个以上的值经过变化得到新值的过程就叫做运算 用于运算的符号称为运算符 运算符的分类: 算数运算符 比较或者关 ...

  6. Python基础0:变量 赋值 表达式和运算符

    变量: 前面我们在使用print()输出内容的时候,如果内容很长,后面要再次输出的时候,就需重新在输入一遍. 如果给输出的内容起个简单的别名.这样我们用简短的别名来代替长内容,下次要输出的时候就直接使 ...

  7. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

  8. 编写可维护的JavaScript—语句和表达式&变量、函数和运算符

    语句和表达式 所有的块语句都应当使用花括号.包括: if for while do…while… try…catch…finally //不好的写法 if (condition) doSomethin ...

  9. Javascript学习2 - Javascript中的表达式和运算符

    原文:Javascript学习2 - Javascript中的表达式和运算符 Javascript中的运算符与C/C++中的运算符相似,但有几处不同的地方,相对于C/C++,也增加了几个不同的运算符, ...

随机推荐

  1. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  2. markdownPad在win10下渲染报错问题

    今天使用MarkdownPad 2,打开后发现预览效果出错了,本来以为自己下载了破解版的缘故导致软件不稳定,后来查找了网上,发现这是一个普遍的问题,根据软件的提示来到官方FAQ页面,找到解决方法. 实 ...

  3. JAVA可视化闹钟源码

    概述 一些同学的Java课设有这样一个问题,比较感兴趣就做了一下 功能介绍: 1.可增加闹钟 2.可删除闹钟 3.时间到了响铃 4.关闭闹钟不会丢失闹钟(因为闹钟存储在txt文件中,不会因程序关闭就终 ...

  4. python学习-logging

    """#设置输出的日志内容格式fmt = '%(asctime)s %(filename)s %(funcName)s [line:%(lineno)d] %(level ...

  5. 函数式编程 -> Lambda

    一.函数式编程 函数式编程,同面向对象编程.指令式编程一样,是一种软件编程范式,在多种编程语言中都有应用.百科词条中有很学术化的解释,但理解起来并不容易.不过,我们可以借助于数学中函数的概念,来理解函 ...

  6. jquery查出元素名称

    <div onclick='$(this).prop("tagName")'></div> 最后的结果 DIV

  7. three.js 制作太阳系统

    最近学了three.js,想拿来练练手,喜欢宇宙,于是亲手撸代码来完成这个,为了更真实,于是查了一些相关资料.1. 距离太阳由近及远分别是[水星,金星,地球,火星,木星,土星,天王星,海王星]2. 他 ...

  8. Wonder暂停开发,开始写书

    公告 大家好,我们决定暂时停止开发Wonder,但会继续维护当前的Wonder版本(如继续维护官网.在线编辑器.QQ群等). 我们当前的主要任务是 写书:基于Wonder 1.0版本的开发经验,写一本 ...

  9. 【玩转SpringBoot】让错误处理重新由web服务器接管

    其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...

  10. Android 框架布局 FrameLayout

    <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" ...