操作符优先级(详细说明+表格+问题表达式)
目录
前言
优先级
结合性
是否控制求值顺序
问题表达式
一、
二、
三、
前言
复杂表达式的求值有三个影响的因素。
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
优先级
相邻的两个操作符才考虑优先级!
此处我们(下表)知道" * "优先级大于" + ":
所以此处是" + "与" * "相邻," * "优先级高,先算" * "。
结合性
相邻的两个操作符的优先级一样时,先算什么就是结合性说的算!
此处我们(下表)知道加法的结合性,是从左到右:
此处二者优先级相同,所以是从左到右计算,先" a "再" b "再" 2 "。
当相邻操作符的优先级不同的情况下,优先级先起作用;优先级相同的情况下,那这个时候的结合性起作用。
是否控制求值顺序
这个是十分特殊的,只有少部分几个为是。(以" && "与" || "为例)
我们按照心中常理分析,会感觉应该输出为a = 1 b = 3 c = 3 d = 5。但是其真实的输出为:
这就是因为其是会控制求值顺序的!
我们知道" && "是错一个即为错," || "是对一个即为对。此处的" && "的第一个是为后置++,先使用时a = 0,即为错,既然已经有一个错误了,那后面为什么都已经没有了必要,所以后面将不会再进行计算,这也就只是执行了" a++ "。这控制了求值顺序!
注:优先级和结合性,只决定运算符和哪些操作数结合和求值顺序毫无关系。
建议:
我们这地方也没有必要特别刻意的把这个优先级啊,全部背下来,没什么大问题,没什么用啊,实际上呢,我们正在写的过程,实在没法拿捏的准时,查一下表,实在是懒了,都不想查的时候,你把它给括号一下,括号明确的时候就可以解决优先级问题。
从上到下优先级,由高到低
操作符 | 描述 | 用法示例 | 结果类型 | 结合性 | 是否控制求值顺序 |
---|---|---|---|---|---|
( ) | 聚组 | ( 表达式 ) | 与表达式同 | 无 | 否 |
( ) | 函数调用 | 函数名 (形参表) | 表达式 | 左到右 | 否 |
[ ] | 下标引用 | 数组名 [常量表达式] | 变量 | 左到右 | 否 |
. | 访问结构成员 | 对象 . 成员名 | 变量 | 左到右 | 否 |
-> | 访问结构指针成员 | 对象指针 -> 成员名 | 变量 | 左到右 | 否 |
++ | 后缀自增 | 变量名 ++ | 表达式 | 右到左 | 否 |
-- | 后缀值减 | 变量名 -- | 表达式 | 右到左 | 否 |
! | 逻辑反 | ! 表达式 | 表达式 | 右到左 | 否 |
~ | 按位取反 | ~ 表达式 | 表达式 | 右到左 | 否 |
+ | 单目,表示正数 | + 表达式 | 表达式 | 右到左 | 否 |
- | 单目,表示负数 | - 表达式 | 表达式 | 右到左 | 否 |
++ | 前缀自增 | ++ 变量名 | 表达式 | 右到左 | 否 |
-- | 前缀自减 | -- 变量名 | 表达式 | 右到左 | 否 |
* | 间接访问 | * 指针变量 | 变量 | 右到左 | 否 |
& | 取地址 | & 变量名 | 表达式 | 右到左 | 否 |
sizeof | 取其长度,以字节表示 | sizeof (表达式) | 表达式 | 右到左 | 否 |
(类型) | 类型转换 | (数据类型) 表达式 | 表达式 | 右到左 | 否 |
* | 乘法 | 表达式 * 表达式 | 表达式 | 左到右 | 否 |
/ | 除法 | 表达式 / 表达式 | 表达式 | 左到右 | 否 |
% | 整数取余 | 整型表达式 % 整型表达式 | 表达式 | 左到右 | 否 |
+ | 加法 | 表达式 + 表达式 | 表达式 | 左到右 | 否 |
- | 减法 | 表达式 - 表达式 | 表达式 | 左到右 | 否 |
<< | 左位移 | 变量 << 表达式 | 表达式 | 左到右 | 否 |
>> | 右位移 | 变量 >> 表达式 | 表达式 | 左到右 | 否 |
> | 大于 | 表达式 > 表达式 | 表达式 | 左到右 | 否 |
>= | 大于等于 | 表达式 >= 表达式 | 表达式 | 左到右 | 否 |
< | 小于 | 表达式 < 表达式 | 表达式 | 左到右 | 否 |
<= | 小于等于 | 表达式 <= 表达式 | 表达式 | 左到右 | 否 |
== | 等于 | 表达式 == 表达式 | 表达式 | 左到右 | 否 |
!= | 不等于 | 表达式 != 表达式 | 表达式 | 左到右 | 否 |
& | 位与 | 表达式 & 表达式 | 表达式 | 左到右 | 否 |
^ | 位异或 | 表达式 ^ 表达式 | 表达式 | 左到右 | 否 |
| | 位或 | 表达式 | 表达式 | 表达式 | 左到右 | 否 |
&& | 逻辑与 | 表达式 && 表达式 | 表达式 | 左到右 | 是 |
|| | 逻辑或 | 表达式 || 表达式 | 表达式 | 左到右 | 是 |
? : | 条件操作符 |
表达式 ?表达式2 : 表达式 3 |
表达式 | 无 | 是 |
= | 赋值 | 变量 = 表达式 | 表达式 | 右到左 | 否 |
+= | 以…加 | 变量 += 表达式 | 表达式 | 右到左 | 否 |
-= | 以…减 | 变量 -= 表达式 | 表达式 | 右到左 | 否 |
*= | 以…乘 | 变量 *= 表达式 | 表达式 | 右到左 | 否 |
/= | 以…除 | 变量 /= 表达式 | 表达式 | 右到左 | 否 |
%= | 以…取模 | 变量 %= 表达式 | 表达式 | 右到左 | 否 |
<<= | 以…左移 | 变量 <<= 表达式 | 表达式 | 右到左 | 否 |
>>= | 以…右移 | 变量 >>= 表达式 | 表达式 | 右到左 | 否 |
&= | 以…与 | 变量 &= 表达式 | 表达式 | 右到左 | 否 |
^= | 以…异或 | 变量 ^= 表达式 | 表达式 | 右到左 | 否 |
|= | 以…或 | 变量 |= 表达式 | 表达式 | 右到左 | 否 |
, | 逗号 | 表达式 , 表达式 , … | 表达式 | 左到右 | 是 |
但是,即使具有优先级,结合性,是否控制求值顺序。表达式是无法确定唯一的计算路径的!于是就会出现一些问题表达式!
问题表达式
无法确定所写的代码的唯一计算路径的,那这个代码就是问题代码!
一、
在计算的时候,由于" * "比" + "的优先级高,只能保证," * "的计算是比" + "早,但是优先级并不能决定第三个" * "比第一个" + "早执行(他们之间是不相邻的,无法利用优先性)。当abcdef为表达式时,不确定的多路径计算会带来不同的答案!(例如:分别都引用了一个变量" x ",就会导致谁先引用," x "先变为什么,然后再被引用。)
二、
" c + --c "就是一个问题代码,虽然我们知道" 前置-- "与" + "优先级是前者大于后者,但是,这还是一个问题代码,因为我们根本无法知道前者c是什么时候准备好的,很可能减后猜准备,有可能还未减时才准备。(这就是随编程器所定的了,所以,其并不是只有一个计算路径。)
类似于上者的代码(资料来源与《C与指针》)
如此多的编译器答案都大大不同!
三、
我们能通过操作符的优先级得知:先算乘法, 再算减法。但是,函数的调用先后顺序无法通过操作符的优先级确定。
如果,按照顺序调用函数:
- (2——3——1)那就是:4 - 2 - 3 = -2;
- (1——2——3)那就是:2 - 3 * 4 = -10;
- ……
这是无法确定唯一路径的。(毕竟,函数什么时候调用是没有标准的。)
操作符优先级(详细说明+表格+问题表达式)相关推荐
- c语言中 的优先级几级,C语言中的操作符优先级的详细介绍
C语言中的操作符优先级的详细介绍 C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用. 下面是来自The C Programming Language 2th的总结. ...
- Java 操作符:Java 中操作符优先级、一二三元操作符及逻辑操作符的中德模佛定理
文章目录 前言 一.操作符介绍与优先级表 二.一元运算符与二元运算符的区别? 三.Java 中唯一的三元操作符 四.逻辑操作符中的德模佛定理 总结 前言 在 Java 中我们常见的操作符分为三种,分别 ...
- 3.03 bison移进/规约冲突和操作符优先级
如果你已经储备bison的相关基础知识,阅读理解下面的代码会轻松得多.没有bison基础的同学请点击查看bison基本的语法规则及相关介绍. 移进/规约冲突一般是由文法二义性造成的,关于二义性可以看看 ...
- c++ 操作符大全-算术操作符、关系操作符、逻辑操作符、位操作符、自增自减操作符、赋值操作符、条件操作符、逗号操作符、操作符优先级
文章目录 操作符 1.算术操作符 2.关系操作符 3.逻辑操作符 4.位操作符 5.自增自减操作符 6.赋值操作符 7.条件操作符 8.逗号操作符 9.操作符优先级 操作符 计算机程序可以看作一串运算 ...
- C++ 操作符优先级
操作符优先级 C++ 操作符优先级如下图 C++ 操作符优先级如下图 该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.c ...
- java lam表达式_详细分析Java Lambda表达式
在了解Lambda表达式之前我们先来区分一下面向对象的思想和函数式编程思想的区别 面向对象的思想: 做一件事情,找一个能解决这个事情的对象,调用他的方法来解决 函数时编程思想: 只要能获取到结果,谁去 ...
- 表达式求值(最详细分析+代码实现+表达式之间的相互转换)
目录 一.概念 二.前缀表达式的逻辑和实现方式 1.定义 2.前缀表达式的计算机求值 3.例子 4.代码实现 三.中缀表达式的逻辑和实现方式 1.定义 2.中缀表达式规则 3.中缀表达式的计算机求值 ...
- python中各操作符的优先级_在Python中实现操作符优先级的一般方法是什么
我不确定您对多少细节感兴趣,但听起来您似乎在寻求实现一个解析器.通常有两个步骤: lexer读取文本并将其转换为标记.例如,它可能读取"2+3*2"并将其转换为INTEGERPLU ...
- C语言运算符优先级 详细列表
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员 ...
最新文章
- vs2008与IIS 7.0使用在vista上时出现的问题及解决方法(Internet Explorer 无法显示该页面)(VS2008: IE Cannot Display Web Page)...
- php 管理 mysql 数据库 代码_安装并使用phpMyAdmin管理MySQL数据库_php
- python常见错误-python中的错误有什么
- UVA11078开放式学分制(前面-后面的最大值)
- 威金病毒、维金病毒、Viking、logo1_.exe专杀 vdll.dll、logo1_.exe、rundl132.exe、_desktop.ini、、0Sy.exe、图标变花...
- python运行mcmc为何老出错_python中mcmc方法的实现
- android builder模式 插件,如何在Kotlin中实现Builder模式?
- Mxnet的.lst文件介绍
- win8卸载mysql数据库,彻底卸载win8自带的metro应用的方法
- (转)HTML5开发中Access-Control-Allow-Origin跨域问题
- oracle10g rac导出ocr,Oracle RAC 迁移OCR(10g)
- 关于top.html和bottom.html文件制作和调用的一点说明
- 如何在 iPhone、iPad 和 Mac 上压缩照片?
- 电感的作用和工作原理
- flutter 文字颜色渐变
- cpuz北桥频率和内存频率_cpu-z里的注:频率是什么意思???高出内存频率
- VOT数据集下载——(vot2013到vot2019)
- ORA-01000-超出打开游标的最大数(解决及原因)
- Vue框架的初识入门
- 港科夜闻|香港科大海洋科学系主任兼讲座教授钱培元:成立产业推广部抢商机...
热门文章
- Java实现 JSON 的组装和解析
- 厉害了|湖北一博物馆获绿色建筑界 “奥斯卡”金级认证
- CSS中font-style的属性斜体Italic oblique的区别
- FDTD_学习笔记2_纳米孔道阵列(nanoholes arry)/交互界面初始/结构设置/仿真区域设置/光源选取/监视器设置/check材料曲线拟合/plot场图
- 利用CNN实现图像和数值数据融合
- 不用微信SDK实现图片分享或文字分享
- 全排列+n皇后问题(C++深度优先搜索与广度优先搜索)
- 又半年,技术的探险(2009.7)
- 贝塔分布(beta分布)及Python实现——计算机视觉修炼之路(二)
- VM:VMware虚拟机内创建第一个Win10系统(ISO镜像)的之详细攻略(图文教程)