平等运营商 - 总是左联合的,是否重要?

时间:2011-12-12 13:05:53

标签: c# operators

在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)

右?

6 个答案:

答案 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)

如果您为具有副作用的相等运算符提供了重载,则可能会产生影响。显然,这是一个可怕而毫无意义的想法,但可能。