在C#规范中说:
除了赋值操作符和空合并运算符之外,所有二进制运算符都是左关联的,这意味着操作是从左到右执行的。 赋值运算符、空合并运算符和条件运算符(?:)是右关联的,这意味着操作是从右到左执行的。
这很清楚,但是像default,delegate,stackalloc,await这样的运营商是如何分类的呢?他们的联想是什么?
对于[],(),例如,它们是一元的还是二进制的,或者从技术上说它们都不是,因为根据标准一元运算符是类似op的,而二进制运算符是类似x op y的。
发布于 2015-12-14 13:15:33
这里没有问题,因为所有非主一元运算符都具有相同的优先级,并且与所有二进制运算符具有不同的优先级。当一个操作数位于两个具有相同优先级的运算符之间时,结合性就会生效,但是一个操作数不能是两个非主一元运算符之间的关联。
所有主要的一元运算符(new、typeof、default、checked、unchecked和delegate)都有语法规则,这意味着它们没有问题--基本上,您可以通过括号/大括号的位置告诉操作数。如果没有括号,可能会出现问题。例如,假设unchecked运算符不需要括号。然后是这个:
unchecked x . y可能意味着没有更多规则的unchecked(x.y)或(unchecked x).y。不过,这不是问题,因为它无论如何都是无效的。
值得注意的是,规范中的优先级和联想性解释实际上只是说明性的--精确的规则已经被编码在语言的语法中了。换句话说,该部分可以从规范中删除,而不会影响任何程序的有效性或意义。(工作也不错,因为有几个错误,IIRC.)
https://stackoverflow.com/questions/34267944
复制相似问题