【问题标题】:Associativity of operators运算符的关联性
【发布时间】:2015-12-14 13:10:50
【问题描述】:

在C#规范中是这样说的:

除了赋值运算符和空合并运算符, 所有二元运算符都是左结合的,这意味着操作是 从左到右执行。

赋值运算符、空合并运算符和 条件运算符 (?:) 是右结合的,这意味着 操作是从右到左进行的。

这已经足够清楚了,但是像defaultdelegatestackallocawait 这样的运算符是如何分类的?它们的关联性是什么?

[]() 也可以这样说,例如;它们是一元还是二元,或者在技术上都不是,因为根据标准一元运算符类似于 op x 而二元运算符类似于 x op y

【问题讨论】:

  • 您提到的“运算符”都不是二进制的。
  • 请提出更具体的问题。您能否提供一个您不确定结果的代码示例?
  • @JonSkeet 它在Primary Operators seciton in C# Operators 页面上是不是很奇怪?
  • @SonerGönül:很奇怪。现在在其他地方检查......也许我错了。
  • 我看到它也在 C# 5 规范和 ECMA 标准中。唔。是的,我想我错了。删除我的第一条评论:)

标签: c# language-lawyer


【解决方案1】:

这里没有问题,因为所有非主一元运算符的优先级彼此相同,而所有二元运算符的优先级不同。当操作数位于具有相同优先级的两个运算符之间时,关联性生效 - 但操作数不能位于两个非主一元运算符之间。

所有一元运算符(newtypeofdefaultcheckeduncheckeddelegate)都有语法规则,这意味着它们不是问题 - 基本上,您可以通过括号/大括号的位置来判断操作数。没有括号,可能会有问题。例如,假设unchecked 运算符不需要括号。那么这个:

unchecked x . y

可能意味着 unchecked(x.y)(unchecked x).y 没有更多规则。不过这不是问题,因为它无论如何都是无效的。

值得注意的是,规范中的优先级和关联性解释实际上只是提供信息 - 精确的规则已经编码在语言的语法中。换句话说,可以从规范中删除该部分,而不会影响任何程序的有效性或含义。 (也做得很好,因为有几个错误,IIRC...)

【讨论】:

  • 那么对于像typeof、checked等主要操作符的operators关键字,我们可以推断出当它们与()一起使用时,它们就像二元运算符,因此从左到右关联?相反,关键字 await 已经被归类为一元运算符,然后从右到左关联(我们不能使用 () 与它)。谢谢你的耐心:)
  • @xdevel2000:同样,关联性仅在有两个具有相同优先级的运算符时才相关,这样一个操作数可以是任何一个“第一”的一部分。你能举个例子说明你认为这与typeof 等有什么关系吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2016-07-19
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
相关资源
最近更新 更多