在c#Language Specification中, 它被发现了 “除了赋值运算符,所有二元运算符都是左关联的”
但它会为平等运营商带来不同吗? ==和!=?
说: bool X,Y,Z ......
返回x == Y == z ......依此类推?
即使x,y,z的顺序在return语句中有所不同,结果总是不一样, 总是返回相同的值? (如果x,y,z的init值明显相同)
(x == y)== z等于x ==(Y == z)和(x!= y)== z等于x!=(Y == z)
右?
答案 0 :(得分:13)
在C#4.0语言规范中,可以找到“除了赋值运算符,所有二元运算符都是左关联的”
仅供参考该行是错误的。空合并运算符也是右关联的 - 并不是真正重要的。有关Jon对此问题的深入分析,请参阅https://stackoverflow.com/a/6269773/88656。
对于仅在bools上运行的等号运算符
==
和!=
,它会有所不同吗?
没有。正如您所正确注意的那样,当仅处理相等运算符且仅处理bool时,运算符关联性是无关紧要的。虽然这是一个有趣的琐事,但我不确定为什么它特别相关。
许多人都回答说它有所不同,因为操作数可能会产生副作用。这些人错了;这是一个非常常见的错误。评估操作数的顺序与运算符的优先级或关联性无关。例如,在C中,允许符合要求的实现以任何顺序计算副作用。如果你说:
x = (A() != B()) == C();
y = D() != (E() == F());
在C中,保证D(),E()和F()不在A(),B()和C()之前运行。但是你无法保证在C()之前计算B()的副作用。 A(),B()和C()可以合法地在C中的任何顺序中执行。 操作员关联性,无论是“自然的”还是由括号强加的,都不会对可能计算副作用的顺序施加任何限制。
C#的情况有所改善。在C#中,无论运算符的优先级或相关性如何,都可以保证操作数的副作用发生从左到右。也就是说,如果你有A() + B() * C()
那么你可以保证A()在B()之前发生,而B()在C()之前发生,不管A()是否涉及添加,优先级低于乘法优先级。
运算符优先级和关联性控制运算符运行的顺序,而不是操作数的计算顺序。
答案 1 :(得分:8)
bool x = false;
int y = 0;
int z = 1;
Console.WriteLine(x == y == z);//won't compile
Console.WriteLine(y == z == x);//will compile
一直到==
的相关性。
答案 2 :(得分:5)
在你的例子中,它很重要。 x==y==z
表示“Z是bool,如果'x == y&& z == true'或者如果'x!= y&& z == false',则该行将返回true ”
是的,重要。
答案 3 :(得分:1)
将其视为(x ^ y ^ z),您将获得答案。
答案 4 :(得分:0)
结果将是相同的。 ==
和!=
的关联性并不重要,但必须选择关联性。
答案 5 :(得分:0)
如果您为具有副作用的相等运算符提供了重载,则可能会产生影响。显然,这是一个可怕而毫无意义的想法,但可能。