运算符的关联性
本文关键字:关联性 运算符 | 更新日期: 2023-09-27 18:26:39
在C#规范中说:
除了赋值运算符和零合并运算符之外,所有二进制运算符都是关联的,这意味着运算是从左到右执行。
赋值运算符、null合并运算符和条件运算符(?:)是右联想的,这意味着操作是从右向左执行的。
这已经足够清楚了,但像default
、delegate
、stackalloc
、await
这样的运算符是如何分类的?它们的关联性是什么?
对于[]
、()
(例如;它们是一元运算符还是二元运算符,或者从技术上讲它们都不是,因为根据标准一元运算符是类似于opx的东西,而二元运算符是像xopy?
这里没有问题,因为所有非主一元运算符的优先级彼此相同,而所有二进制运算符的优先级不同。当操作数位于具有相同优先级的两个运算符之间时,关联性就会生效,但操作数不能位于两个非主一元运算符之间。
所有主一元运算符(new
、typeof
、default
、checked
、unchecked
和delegate
)都有语法规则,这意味着它们不是问题——基本上,您可以通过括号/大括号的位置来判断操作数。如果没有括号,可能会出现问题。例如,假定unchecked
运算符不需要括号。然后这个:
unchecked x . y
可以是指没有更多规则的CCD_ 14或CCD_。这不是问题,因为它无论如何都是无效的。
值得注意的是,规范中的优先级和关联性解释实际上只是信息性的——精确的规则已经编码在语言的语法中了。换句话说,该部分可以从规范中删除,而不会影响任何程序的有效性或意义。(也做得很好,因为有几个错误,IIRC…)