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

Nik*_*las 6 c# operators

在c#语言规范中,可以找到"除了赋值运算符,所有二元运算符都是左关联的"

但它会为平等运营商带来不同吗?==和!=?

说:bool X,Y,Z ......

return x == Y == z ...依此类推?

即使x,y,z ...的顺序在return语句中有所不同,结果总是相同的,总是返回相同的值吗?(如果x,y,z的init值明显相同)

(x == y)== z等于x ==(Y == z)和(x!= y)== z等于x!=(Y == z)

对?

Eri*_*ert 13

在C#4.0语言规范中,它被发现"除了赋值运算符,所有二元运算符都是左关联的"

仅供参考该行是错误的.空合并运算符也是右关联的 - 并不是真正重要的.有关Jon对此问题的深入分析,请参阅/sf/answers/438884141/.

对于平等运营商而言==,它是否会产生差异!=

不.正如您所正确注意的那样,只处理相等运算符时,运算符关联性是无关紧要的.虽然这是一个有趣的琐事,但我不确定为什么它特别相关.

很多人都回答说它有所不同,因为操作数可能会产生副作用.这些人错了; 这是一个非常常见的错误.评估操作数的顺序与运算符的优先级或关联性无关.例如,在C中,允许符合要求的实现以任何顺序计算副作用.如果你说:

x = (A() != B()) == C();
y = D() != (E() == F());
Run Code Online (Sandbox Code Playgroud)

在C中,您可以保证D(),E()和F()不会在A(),B()和C()之前运行.但是你无法保证在C()之前计算B()的副作用.A(),B()和C()可以在C中以任何顺序执行,合法地执行. 操作员关联性,无论是"自然的"还是由括号强加的,都不会对可能计算副作用的顺序施加任何限制.

C#的情况有所改善.在C#中,无论运算符的优先级或关联性如何,都可以保证操作数的副作用从左到右发生.也就是说,如果你有,那么你可以保证A()在B()之前发生,而B()在C()之前发生,不管A()是否包含在一个优先级低于乘法的加法中.A() + B() * C()

运算符优先级和关联性控制的顺序操作员运行,而不是其中的顺序操作数计算.


Jon*_*nna 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
Run Code Online (Sandbox Code Playgroud)

一切都归结为==.


Tip*_*ipx 5

在你的例子中,它很重要.x==y==z将意味着"Z是一个bool,如果'x == y && z == true'或者'x!= y && z == false'",该行将返回true.

所以是的,这很重要.

  • 一些操作数有副作用的事实与它有什么关系?副作用将从左到右依次发生; 请记住,**优先级和关联性与**中评估操作数的顺序无关.优先级和关联性控制*运算符*的计数顺序;*操作数*从左到右进行评估. (2认同)