运算符的关联性

本文关键字:关联性 运算符 | 更新日期: 2023-09-27 18:26:39

在C#规范中说:

除了赋值运算符和零合并运算符之外,所有二进制运算符都是关联的,这意味着运算是从左到右执行。

赋值运算符、null合并运算符和条件运算符(?:)是右联想的,这意味着操作是从右向左执行的。

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

对于[]()(例如;它们是一元运算符还是二元运算符,或者从技术上讲它们都不是,因为根据标准一元运算符是类似于opx的东西,而二元运算符是像xopy

运算符的关联性

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

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

unchecked x . y

可以是指没有更多规则的CCD_ 14或CCD_。这不是问题,因为它无论如何都是无效的。

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