微软更喜欢虚假价值?

我正在读Jon Skeet的书。 (#4)

但有一件事(其中包括)引起了我的注意:

话题:布尔?

他在一张表中写道:( X,Y是bool?)

X | Y | X & Y --------------------------- true null null 

好吧…所以null是决定的人。 bool操作数在这里失去了。

 X | Y | X & Y --------------------------- false null false 

为什么? 为什么这里的bool操作数正在考虑中,而在之前的样本中,是谁决定了结果?

似乎真假在不同的地方有朋友…. 🙂

发音nullunknown

 true & unknown => unknown false & unknown => false because the second operand does not matter. 

当然还有OR的镜像表:

 true | unknown => true because the second operand does not matter. false | unknown => unknown 

它适用于&&|| 同样。

它以这种方式设计的原因是与三值逻辑一致,如在许多其他平台(包括SQL)中实现的那样。 在Kleene逻辑(基于三值逻辑的逻辑)中, TRUE AND UNKNOWN给出UNKNOWN ,而FALSE AND UNKNOWN给出FALSE

你可以参考标题为“ 布尔? 在“ 使用可空类型(C#编程指南) ”中键入 C#中的结果的说明和枚举。

根据微软的说法,它是……

确保&和|产生的结果 运算符与SQL中的三值布尔类型一致

有关可空布尔值的按位运算的真值表可以在此页面上找到 。

原因是你现在正在处理三值逻辑 。

  • 对于AND运算符(be it&or &&),表达式结果可以在第一次匹配时确定为FALSE。
  • 对于OR运算符(be | |或||),可以在第一次匹配时确定表达式结果为TRUE。
  • 对于具有最左操作数NULL的任何布尔操作将返回NULL。

因此,您列出的表是不完整的:您需要更多条目才能看到发生了什么,因为有8种可能的输入组合(如果计算null operator null组合则为9)。

和:

 X | Y | X & Y --------------------------- true null null null true null false null false null false null true false false true true true false true false false false false 

要么:

 X | Y | X | Y --------------------------- true null true null true null false null null null false null true false true true true true false true true false false false 

使用你的friends比喻,你可以说,对于三值逻辑,AND支持FALSE和NULL作为结果,而OR支持TRUE和NULL。

&&和|| 根据短路评估对运营商进行评估 。 这意味着一旦确定复杂表达式为假,则不会检查其余表达式。 由于第二个表达式中的假值足以确定逻辑AND的结果,因此结果直接确定为false。

Interesting Posts