今天才发现原来有人把操作符优先级和执行顺序混在一起了 ——轮子哥
举个例子来说明操作符优先级和执行顺序之间的关系就知道了。
1 + 2 + 3 × 4 = 3 + 3 × 4 = 3 + 12 = 15
乘法优先级高于加法,然而先执行的是加法运算。
该如何解释这种现象呢
如果提到波兰式和逆波兰式的话,就明白的话,就不用向下看了(逃
逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。
——喂鸡百科
划重点了,逆波兰记法不需要括号来标识操作符的优先级
也就是说,表达式和运算符优先级没什么关系。括号是用来确定语法树结构的,而优先级的作用就是少写两个括号,书写观看方便点。
如果还不明白,或者不了解逆波兰式,再举个例子就明白了,(懒,直接贴喂鸡的Demo了
中缀表达式“5 + ((1 + 2) * 4) − 3”写作
5 1 2 + 4 * + 3 −
下表给出了该逆波兰表达式从左至右求值的过程,堆栈栏给出了中间值,用于跟踪算法。
输入 | 操作 | 堆栈 | 注释 |
---|---|---|---|
5 | 入栈 | 5 | |
1 | 入栈 | 5, 1 | |
2 | 入栈 | 5, 1, 2 | |
+ | 加法运算 | 5, 3 | (1, 2)出栈;将结果(3)入栈 |
4 | 入栈 | 5, 3, 4 | |
* | 乘法运算 | 5, 12 | (3, 4)出栈;将结果(12)入栈 |
+ | 加法运算 | 17 | (5, 12)出栈;将结果 (17)入栈 |
3 | 入栈 | 17, 3 | |
− | 减法运算 | 14 | (17, 3)出栈;将结果(14)入栈 |
计算完成时,栈内只有一个操作数,这就是表达式的结果:14
上述运算可以重写为如下运算链方法(用于HP的逆波兰计算器)
1 2 + 4 * 5 + 3 −