关于逆波兰表示法的快速问题。
Why is 2*3/(2-1)+5*(4-1)?: (original)
23*21-/541-*+
rather than 23*21-/5+41-*?
我只是把自己搞糊涂了。就我个人而言,我会在原来的问题中添加额外的括号,以明确 5 添加的位置。如果它不存在,我假设它按什么顺序进入?
谢谢
这是因为乘法的优先级高于加法。如果没有大括号,则首先将 5(仅)与 (4-1) 相乘,然后添加到表达式的其余部分。当您没有使用大括号时,它仅根据优先顺序进行评估。
如果我们假设传统的运算顺序,那么任何乘法都会在任何加法之前计算。所以,当你有 根据通常的运算顺序,首先计算
y+x*z
、x*z
。更明确地说,y+x*z
的意思是 (y+(x*z))
。
因此,
2*3/(2-1)+5*(4-1)
的意思是 (((2*3)/(2-1))+(5*(4-1)))
如果您事先明确声明您将运算顺序规定为加法发生在乘法之前,那么如果您写下
4+5*6
,您的意思就是 ((4+5)*6)
。如果你这样做了,那么你可以将分配律表述为 x*y+z=(x*y)+(x*z)
。当省略运算时,表达式意味着什么?
考虑
xy&z
,其中 &
是二元,并且 xy
的二元运算被省略。如果省略的二元运算是 *
,并且 &
是 +
,那么这意味着所表达的运算 &
将在抑制的乘法运算之前发生。
通常,忽略的操作被假定为首先发生。因此,如果加法的绑定优先级高于乘法,那么像
xy
这样的表达式表示 x+y
而不是更常见的 x*y
可能是有意义的。
原则上,让加法在乘法之前发生似乎没有什么问题,只要你声明你想预先这样做并坚持该约定及其在你所写的内容中的含义。
话虽如此,除了与不懂 RPN 或 PN 的人交流之外,我根本不明白为什么一旦你了解了 RPN 和 PN 还要用中缀表示法来书写。