为什么C#&&和|| 运营商的工作方式如何?

5 c#

这是一个tl;博士

我来自C++背景.&&假设检查左侧是否为真,右侧是否为真.与此有什么关系?为什么在&&逻辑中使用它?


我无法理解http://msdn.microsoft.com/en-us/library/aa691312%28v=vs.71%29.aspx并提出了一个问题.我花了很长时间才理解并接受这个答案.我不得不做很多跟进阅读操作员如何重载真假工作?

操作x && y被评估为T.false(x)?x:T.&(x,y)

为什么它这样做呢?如果false重载返回true并且true运算符返回true,则根本不计算y.WTF !!!!

我仍然无法理解它.因为这对我来说太奇怪了,我花了一些时间来理解另一个问题的答案.在C#v = 1 && 2;中不能正常工作你不能做&& on onts.在C中,这返回true(继承人代码/示例http://codepad.org/9iCaqzQ2).如果我们遵循上面的操作规则,我们会这样做

(使用1 && 2)

  • Int.False(1)是错误的
  • 1&2(== 0)
  • Int.True(0)(== false)

这会让你得到错误的结果.

那么...... C#以它的方式执行&&(和||)运算符的原因是什么.

Mar*_*ell 8

&&被定义为短路运营商; 如果第一个操作数评估为假,则要求在那里短路而不评估右侧.你还期望它做什么?这允许检查等if(arg != null && arg.Foo) {...}.

你的问题基本上是说"如果我写了一个错误的操作错误的实现,那么坏事就会发生"......所以; 不要那样做!要么不写一个真/假运营商在所有的,或者如果你做的; 做对了...

也有&|它做短路.


Cod*_*aos 3

据我了解,您更愿意a && b被定义为类似的东西,((bool)a)&&((bool)b)而不是 C# 使用的东西。

但我认为引入这种运算符重载是为了支持三态布尔值,例如bool?DBBool

让我们为这种类型定义几个示例:

不可能出现短路:

null && true == null
null && false == false
null || true == true
null || false == null
Run Code Online (Sandbox Code Playgroud)

可能发生短路:

false && null == false
true || null == true
Run Code Online (Sandbox Code Playgroud)

这里的基本思想是将 null 视为未知值,如果结果不确定,则返回 null;如果无论您在 null 参数中输入什么内容,结果都不会改变,则返回 bool 。

现在您想要在该类型上定义一个短路逻辑andand or。如果您使用 C#truefalse运算符来执行此操作,它们都会返回false一个null参数,您将获得所需的行为。对于类似交流的行为,你不会。

C# 设计者可能不关心整数上的逻辑and/ ,or就像您的示例一样。整数不是布尔值,因此不应提供逻辑运算符。bool 和 integer 是同一个东西,这是 c 的历史属性之一,新语言不需要反映这一点。并且 s 上的按位运算符与逻辑运算符的区别int仅存在于 c 中,因为 c 无法区分布尔值和整数。对于区分这些类型的语言来说,这种区别是不必要的。

呼唤&按位运算会产生误导。&&vs的本质&不是逻辑 vs 按位and。这不是由您使用的运算符决定的,而是由您使用的类型决定的。在逻辑类型(boolbool?DBBool)上,两个运算符都是逻辑运算符,在整数类型上&是按位运算符,&&没有意义,因为不能对整数进行短路。&&vs的本质&是第一个短路,第二个不短路。

对于定义了运算符的情况,这与 c 解释一致。自从&&&&没有在整数上定义,因为这对于 C# 解释如何对整数求值的问题没有意义,&&不存在。