为什么x ++的优先级高于++ x?

时间:2010-02-07 19:41:27

标签: c#

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

2 个答案:

答案 0 :(得分:17)

让我们从定义一些术语开始,以便我们都谈论同样的事情。

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

一元运算符是“+ x”,“ - x”,“~x”,“!x”,“++ x”,“ - x”和演员“( T)×”。

主要运算符的定义优先于一元运算符。

你的问题是

  

是否存在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 ++中的运算符有不同的体验。

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

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

进行特定提议的设计更改,我们将看到其后果是什么。

答案 1 :(得分:2)

John,你自己回答了这个问题:这两个结构主要用于函数调用:++x - 当你想先增加值然后调用一个函数时,x++当你想要调用一个函数,然后进行增加。根据具体情况,这可能非常有用。查看return x++ vs return ++x我认为没有错误点:代码意味着它的读取方式:)唯一的问题是程序员,他可能会使用这两种结构而不了解运算符的优先级,因此错过了意思。