7

这个页面说“前缀运算符通常是右关联的,而后缀运算符是左关联的”(强调我的)。

是否有左关联前缀运算符或右关联后缀运算符的真实示例?如果不是,假设的会是什么样子,如何解析?

4

6 回答 6

2

原则上可以有。例如,考虑前缀一元加减运算符:假设+是恒等运算并-否定一个数值。

它们“通常”是右结合的,意思+-1是等价于+(-1),结果是负一。

假设它们是左结合的,那么表达式+-1将等价于(+-)1

因此,语言必须为子表达式赋予意义+-。语言“通常”不需要它具有含义并且不赋予它一个含义,但是您可能可以想象一种函数式语言,其中将恒等运算符应用于否定运算符的结果是一个运算符/函数,它具有完全与否定运算符相同的效果。那么对于本例,完整表达式的结果将再次为 -1。

实际上,如果将并列函数/运算符的结果定义为与以从右到左的顺序应用两者具有相同效果的函数/运算符,那么将它们关联的方式始终对表达式的结果没有影响. 这些只是定义它的两种不同方式(f g)(x) == f(g(x))。但是,如果您的语言定义+-为除 之外的其他含义-,那么关联性的方向将很重要(而且我怀疑对于习惯于“通常”语言的人来说,该语言将很难阅读……)

另一方面,如果语言不允许并列操作符/函数,那么前缀操作符必须是右结合的以允许表达式+-1。不允许并列是另一种(+-)没有意义的说法。

于 2012-12-29T19:47:10.627 回答
2

我不知道在真实语言中这样的事情(例如,至少有十几个人使用过的语言)。我怀疑“通常”仅仅是因为证明否定几乎是不可能的,因此通过不做出绝对陈述来避免关于琐事的争论更容易。

至于你理论上如何做这样的事情,似乎有两种可能性。给定两个前缀运算符@并且#您将其视为左关联,您可以将其解析@#a为等价于#(@(a)). 至少对我来说,这似乎是一个真正可怕的想法——理论上是可能的,但这种语言即使是他们最大的敌人也不应该希望。

另一种可能性是@#a被解析为(@#)a. 在这种情况下,我们基本上将@and组合#成一个运算符,然后将其应用于a.

在大多数典型的语言中,这可能不会很有趣(本质上与它们是右结合的含义相同)。另一方面,我可以想象一种面向多线程编程的语言,它规定单个运算符的应用程序始终是原子的 - 当您使用左关联解析将两个运算符组合成一个时,产生的融合运算符仍然是一个单一的原子操作,而仅仅连续应用它们就不会(必然)是。

老实说,即使这有点牵强,但我至少可以想象这是一种可能性。

于 2012-12-30T02:05:35.360 回答
2
于 2012-12-29T23:52:52.513 回答
1

I hate to shoot down a question that I myself asked, but having looked at the two other answers, would it be wrong to suggest that I've inadvertently asked a subjective question, and that in fact that the interpretation of left-associative prefixes and right-associative postfixes is simply undefined?

Remembering that even notation as pervasive as expressions is built upon a handful of conventions, if there's an edge case that the conventions never took into account, then maybe, until some standards committee decides on a definition, it's better to simply pretend it doesn't exist.

于 2012-12-29T22:24:24.323 回答
0

假设的例子。一种语言的前缀运算符@和后缀运算符#具有相同的优先级。如果两个运算符都是左关联的,则表达式@x#将等于( @x)#;如果两个运算符都是右关联的,则表达式 @x# 将等于 (@x)# 。

于 2013-01-21T16:42:28.470 回答
0

我不记得任何左关联前缀运算符或右关联后缀运算符。但我可以想象两者都可以轻松存在。它们并不常见,因为人们寻找操作员的自然方式是:更接近身体的方式 - 先申请

来自 C#/C++ 语言的简单示例:

~-3相等2,但 -~3相等4

这是因为这些前缀运算符是右结合的,因为~-3这意味着首先应用 - 运算符,然后将 ~ 运算符应用于前一个结果。这将导致整个表达式的值将等于2

假设您可以想象,如果这些运算符是左关联的,那么~-3首先应用最左边的运算符~,然后应用-到前一个的结果。这将导致整个表达式的值将等于4

[编辑]回答史蒂夫杰索普

史蒂夫说:the meaning of "left-associativity" is that +-1 is equivalent to (+-)1

我不同意这一点,并认为这是完全错误的。为了更好地理解左关联性,请考虑以下示例:

假设我有一个带有左关联前缀运算符的假设编程语言:

@- 将操作数乘以3

#- 添加7到操作数

比我的语言中的以下构造@#5将等于(5*3)+7 == 22 如果我的语言是右结合的(如大多数常用语言),我将拥有(5+7)*3 == 36

请让我知道,如果你有任何问题。

于 2012-12-29T18:47:13.787 回答