中缀运算符在编程语言中有多有用?


13

中缀运算符在编程语言中有多有用?他们值得他们提供额外的复杂性吗?您能否提供一些示例,其中中缀运算符更适合仅通过重载普通运算符就无法解决的问题?


5
你一定是个轻狂者。我对吗?
missingfaktor

@missingfaktor:很少使用它
Casebash 2010年

1
中缀运算符与运算符重载有何关系?
Rein Henrichs

3
值得注意的是,大多数流行的OO(ish)语言都使用方法名称的前缀。确实,某些语言会花费一定的时间来允许将“静态”方法编写为arg1.method(arg2)而不是method(arg1, arg2)
汤姆·哈特芬

Answers:


16

我认为中缀运算符源于数学。

这个:

2 + 3 * 4

对大多数人而言,它比

(+ 2 (* 3 4))

因为大多数人都熟悉数学。

在Haskell中足够有趣的是,您可以在前缀和前缀之间跳转。这使用相同的功能“(+)”:

(+) 1 2
1 + 2

这使用了相同的功能“ elem”:

elem 42 [1,2,42]
42 `elem` [1,2,42]

重载普通操作员可以解决大多数情况
Casebash 2010年

1
@Casebash:那些“普通”运算符有时也是infix。
liori 2010年

2
我一定比(+ 1 2) 这更奇怪,因为我发现比更具可读性1 + 2。至少(+ 1 2 3 4 5)比更好1 + 2 + 3 + 4 + 5
乔D

还有RPN:先推元素,再推运算符。
PhiLho 2011年

@PhiLho也称为后缀运算符!像这样:1 2 +1 2 3 4 5 +更通常情况下是最后一种情况1 2 + 3 + 4 + 5 +。实际上,对那些人而言,有一个很不错的优势,那就是它可以完美地建模基于堆栈的系统,并且很少(如果有的话)需要括号来调整运算符的优先级。
CodexArcanum 2012年

6

计算机语言是为人类而非机器而设计的。而且,与前缀或后缀相比,人类更习惯于使用前缀运算符。


6

中缀运算符的唯一真实原因是人类通常会更容易阅读它们。这主要是由于两个事实:

  • 我们从很小的时候就以数学的形式学习中缀运算符,因此对它们很熟悉:2 * 2 = 4等等。
  • 前缀运算符的优点是“可视地”分离两个参数。例如(some complex expression) + (some other complex expression)

从逻辑/机器的角度来看,中缀运算符实际上并没有增加任何值,在某些情况下是很麻烦的:

  • 您始终可以使用两个参数将infix转换为等效的函数调用-因此infix运算符仅不过是“语法糖”
  • 当您要使用两个以上的参数时,Infix可能会带来不便。(* 1 2 3 4 5)例如,在Lisp中,用数字集乘法可以说是一种更简洁的语法。
  • 从解析的角度来看,首先读取运算符通常很有用,这样您便知道如何解释表达式的其余部分。使用infix运算符,这可能会更加复杂(例如,您必须维护一个堆栈或类似的方法来找出哪个运算符适用于哪些参数)
  • 在基于堆栈的/连接语言(例如Forth)中,您希望运算符最后被压入堆栈,以便它的参数已经在正确的位置。同样,将运算符埋在令牌序列的中间只会使事情复杂化。
  • 中缀运算符在过载时确实会造成很大的混乱-例如,将“ +”应用于两个HashMap意味着什么?在这里,对infix运算符的直观人类理解会不利于您,因为很容易假设出并非实际意图的含义.....

我认为最后一个论点是假的。程序员应使用合理的名称命名函数,无论使用符号还是字母。
汤姆·霍顿

@Tom-当然,程序员应该选择明智的名称。但是,“明智”的关键标准之一是“其他人可以直观地理解吗?” -我已经看到很多情况下操作员超载的情况远非如此。我不想对某人应用于任何任意数据类型时“ >> =”含义的怪异定义进行反向工程。请使用正确的函数名称!
mikera 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.