Lua实现后缀表达式求值错误:-2^2计算结果为4而非预期-4
问题核心原因
你对-2^2的后缀表达式转换预期本身就是错误的,且优先级配置不符合数学运算规则:
- 数学中
-2^2的运算顺序是先算幂运算2^2,再对结果取负,最终结果为-4,对应的正确后缀表达式应为2 2 ^ UMINUS,而非你认为的-2 2 ^(这个表达式对应的是(-2)^2,结果自然是4)。 - 你当前的优先级配置把一元负号
UMINUS的优先级设为3,高于幂运算CARET的优先级2,会强制解析器先处理取负操作,再处理幂运算,直接导致运算顺序错误。
修复方案
调整优先级表中UMINUS和CARET的优先级顺序,将幂运算的优先级设置得高于一元负号:
local PRECEDENCE = { [Token.Type.MINUS] = 0, [Token.Type.PLUS] = 0, [Token.Type.ASTERIK] = 1, [Token.Type.SLASH] = 1, [Token.Type.UMINUS] = 2, [Token.Type.CARET] = 3 }
调整后解析-2^2会得到正确的输出队列:
{ 2, 2, CARET, UMINUS }
对该队列求值即可得到正确结果-4。
补充说明
你使用在线后缀计算器得到结果4,是因为你输入的后缀序列本身对应的就是(-2)^2的运算逻辑,并非计算器计算错误。
内容的提问来源于stack exchange,提问作者imp
相关产品推荐
相关产品推荐

