【问题标题】:Why does x++ have higher precedence than ++x?为什么 x++ 的优先级高于 ++x?
【发布时间】:2010-02-07 19:41:26
【问题描述】:

后自增 ++ 运算符的优先级高于前自增 ++ 运算符有什么意义?因此,是否存在 x++ 与 ++x 具有相同优先级的情况会导致表达式返回错误结果?

【问题讨论】:

  • 我想结果会不同并且没有错误是有道理的
  • ++x++ 的结果是什么?
  • @Anon:自增运算符的操作数必须是属性或变量。但是这种事情的结果永远不是属性或变量,而是一个值。所以 ++x++ 在 C# 中总是一个错误,不管关联性或优先级如何;无论哪一个发生在“逻辑上首先”,都会产生不能作为另一个操作数的东西。

标签: c#


【解决方案1】:

让我们从定义一些术语开始,这样我们都在谈论同一件事。

主要操作符有后缀“x++”和“x--”,成员访问操作符“xy”,调用操作符“f(x)”,数组解引用操作符“a[ x]",以及 new、typeof、default、checked、unchecked 和 delegate 运算符。

一元运算符是“+x”、“-x”、“~x”、“!x”、“++x”、“--x”和强制转换“( T)x"。

根据定义,主运算符的优先级高于一元运算符。

你的问题是

是否存在 x++ 与 ++x 具有相同优先级的情况会导致表达式返回错误结果?

“错误的结果”对我来说完全不清楚逻辑上是什么意思。如果我们以这样一种方式更改优先级规则,使表达式的值发生更改,那么新结果将是正确的结果The right result is whatever the rules say the right result is。这就是我们定义“正确的结果”的方式——正确的结果是您正确应用规则时得到的结果。

我们尝试设置规则,以便它们有用并且让您能够轻松表达您想要表达的意思。这就是您所说的“错误结果”吗?也就是说,您是在问是否存在一种情况,即对正确答案的直觉是不正确的?

我向您提出,如果是这样,那么这不是一个有用的角度,因为 almost no one's intuition about the "correct" operation of the increment operators actually matches the current specification, much less some hypothetical counterfactual specification。在我编辑的几乎每一本 C# 书籍中,作者都​​以某种微妙或粗暴的方式错误地说明了增量运算符的含义。

这些是具有不寻常语义的副作用操作,它们来自一种语言 - C - 具有故意模糊的操作语义。我们在 C# 的定义中努力让递增和递减运算符变得合理且严格定义,但不可能想出对每个人都具有直观意义的东西,因为每个人对 C 和 C++ 中的运算符都有不同的体验.

也许从不同的角度解决问题会有所帮助。您的问题预设了一个反事实世界,其中后缀和前缀 ++ 被指定为具有相同的优先级,然后要求对该反事实世界中的设计选择进行批评。但是有许多不同的方式可能发生。我们可以通过将它们都放入“主要”类别来使它们具有相同的优先级。或者我们可以通过将它们都放入“一元”类别来使它们具有相同的优先级。或者我们可以在主要和一元之间创造一个新的优先级。或低于一元。或高于初级。我们还可以更改运算符的关联性,而不仅仅是它们的优先级。

也许您可以澄清一下您想批评哪个反事实世界的问题。鉴于任何这些反事实,我可以批评您该选择将如何导致不必要的冗长或混乱的代码,但如果没有明确的反事实设计概念您要求批评,我担心我会花很多时间批评你真正想到的东西之外的东西。

进行具体提议的设计更改,我们将看到它的后果。

【讨论】:

  • 我以为我知道我的问题是什么意思,但现在我发现我的问题没有多大意义。不管怎样,谢谢你的帮助
  • @AspOnMyNet:我认为这里有一个很好的问题,只是不清楚这个问题到底是什么。如果您想尝试澄清它,我很乐意尝试一下。
  • 我并没有一个清晰的概念,到底是什么困扰着我,这更像是一个模糊的想法,结果证明这根本不是一个想法: D.我也感觉到某处有一个问题,但我觉得我应该更精通数学,以便提出关于该主题的任何有意义的问题
【解决方案2】:

John,你自己回答了这个问题:这两种结构主要用于函数调用:++x - 当你想先增加值然后调用一个函数时,x++ 当你想调用一个函数时功能,然后增加。这可能非常有用,具体取决于上下文。看看return x++ vs return ++x,我看不出有什么错误:代码的意思就是它的读取方式:) 唯一的问题是程序员,他们可能会在不了解运算符优先级的情况下使用这两种结构,从而错过了意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 2012-12-29
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2016-12-28
    相关资源
    最近更新 更多