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

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

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

主要运算符是后缀“x ++”和“x–”,成员访问运算符“xy”,调用运算符“f(x)”,数组解引用运算符“a [x]”和new,typeof,默认,选中,取消选中和委托运营商。

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

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

你的问题是

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

对于我来说,“错误的结果”在逻辑上是什么意思并不清楚。 如果我们改变了优先级规则,使得表达式的值发生了变化,那么新结果将是正确的结果 。 正确的结果是规则所说的正确结果 。 这就是我们如何定义 “正确的结果” – 正确的结果是您在正确应用规则时获得的结果。

我们尝试设置规则,使它们很有用,并且可以很容易地表达您想要表达的含义 。 这就是“错误结果”的意思吗? 也就是说,您是否在询问是否存在一种情况,即一个人对正确答案的直觉是不正确的?

我向你提出,如果是这种情况,那么这不是一个有用的角度,因为几乎没有人对增量运算符的“正确”运算的直觉实际上与当前规范相匹配,更不用说一些假设的反事实规范了 。 在我编辑的几乎所有C#书中,作者都​​以某种微妙或粗略的方式误解了增量运算符的含义。

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

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

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

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

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