我正在为整数编写一个小的自制计算器,它包括两个二元运算符,'pow'和'root'。 'pow'运算符计算(左操作数)^(右操作数),'root'运算符找到最大数n,使得n ^(左操作数)< =(右操作数)。
假设这不是一件荒谬的事情,这些算子的优先级应该是什么?目前我有相同的优先级,所以像
这样的字符串3 root 1500 pow 7
从左到右评估。这是正确的吗?我应该把这个问题放在mathoverflow上吗?
答案 0 :(得分:4)
pow
和root
本质上是相同的操作,表达方式不同(类似于二进制+和 - )。即,sqrt(a)
与pow(a, 0.5)
相同,就像a + b
与a - (-b)
相同。所以我会说他们应该有相同的优先权,因此从左到右进行评估。
答案 1 :(得分:3)
在大多数其他语言中,取幂从右到左。这是因为(a ^ b)^ c = a ^(b * c)!= a ^(b ^ c)。例如,参见Python(第5.4节)
中关于幂运算符的部分答案 2 :(得分:1)
pow和root在数学上具有相同的优先级,您可以看到here:
标准操作顺序,或 优先权,表示在 以下图表。
正如其他人所说
3 root 1500 = 1500 pow (1/3)
因此它们是反函数。反函数具有相同的优先级。
你的操作数的顺序也很不寻常。我更喜欢1500根3是最大的整数< =立方根1500。
答案 3 :(得分:1)
在这种特殊情况下,优先级似乎很好 - 你会遇到关联性问题,在某些情况下它可以作为优先级等效。原因是你做了args to root reverse而不是pow我们倾向于把它视为一个“自然”的命令 - left arg受到右边arg的操作,你的root实际上只是1 / y的pow。
所以,你可能需要尝试一些更复杂的表达式,例如A root B root C pow D root G等等。如果你按照与pow相同的顺序保留root的args,它会好得多。