c# - 相等运算符——总是左结合的,这有关系吗?

标签 c# operators

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

相关文章:

javascript - 计算网站中点击次数最多的视频

python - python中a<b<c是什么意思?

c++ - 创建一个接受 2 个输入参数的文字运算符函数

mysql - 如何排除不等于运算符的 NULL?

operators - 所有不同的 Perl 6 相等运算符有什么关系? (==,===,eq,eqv,~~,= :=, ...)

c# - regex.replace 中 $0 的问题 - c#

c# - 文本框.SelectionStart

c++ - 什么是 C++ 中的 <=> ("spaceship",三向比较)运算符?

c# - 开闭原则

c# - 如何通过自定义子字符串相等性仅迭代不同的字符串值