在 C# 中 Language Specification , 它被发现 "除了赋值运算符,所有的二元运算符都是左结合的"
但这对 Equality 运算符会有影响吗? == 和 != ?
说: bool X,Y,Z ...
返回 x==Y==z ...等等?
即使返回语句中 x,y,z 的顺序不同,结果不会总是相同的, 总是返回相同的值? (如果x,y,z的初始值明显相同)
(x==y)==z 等于 x==(Y==z) 并且 (x!=y)==z 等于 x!=(Y==z)
对吧?
最佳答案
In the C# 4.0 Language Specification, its to be found "Except for the assignment operators, all binary operators are left-associative"
仅供引用,该行是一个错误。空合并运算符也是右结合的——这并不重要。参见 https://stackoverflow.com/a/6269773/88656感谢 Jon 对这个问题的精彩分析。
Will it make at difference for equality operators
==
and!=
operating only on bools?
没有。正如您正确注意到的那样,当仅处理相等运算符且仅处理 bool 值时,运算符关联性是无关紧要的。虽然这是一个有趣的琐事,但我不确定为什么它特别相关。
许多人回答说这会有所不同,因为操作数中可能存在副作用。这些人错了;这是一个极其常见的错误。计算操作数的顺序与运算符的优先级或结合性无关。例如,在 C 中,允许符合规范的实现以任何顺序计算副作用。如果你说:
x = (A() != B()) == C();
y = D() != (E() == F());
在 C 中,可以保证 D()、E() 和 F() 不会在 A()、B() 和 C() 之前运行。但是不能保证 B() 的副作用在 C() 之前计算。 A()、B() 和 C() 可以在 C 中以任何顺序合法地执行。 运算符结合性,无论是“自然”的还是由括号强加的,都不会对计算副作用的顺序施加任何限制。
这种情况在 C# 中有所改善。在 C# 中,无论运算符 的优先级或关联性如何,您都可以保证观察到操作数 的副作用从左到右。也就是说,如果你有 A() + B() * C()
那么你可以保证 A() 发生在 B() 之前并且 B() 发生在 C() 之前,无论A() 涉及优先级低于乘法的加法。
运算符优先级和结合性控制着运算符的运行顺序,而不是操作数的计算顺序。
关于c# - 相等运算符——总是左结合的,这有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474780/