在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()
运算符优先级和关联性控制的顺序操作员运行,而不是其中的顺序操作数计算.
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)
一切都归结为==.
在你的例子中,它很重要.x==y==z将意味着"Z是一个bool,如果'x == y && z == true'或者'x!= y && z == false'",该行将返回true.
所以是的,这很重要.
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |