微软更喜欢虚假价值?
我正在读Jon Skeet的书。 (#4)
但有一件事(其中包括)引起了我的注意:
话题:布尔?
他在一张表中写道:( X,Y是bool?)
X | Y | X & Y --------------------------- true null null
好吧…所以null是决定的人。 bool操作数在这里失去了。
X | Y | X & Y --------------------------- false null false
为什么? 为什么这里的bool操作数正在考虑中,而在之前的样本中,是谁决定了结果?
似乎真假在不同的地方有朋友…. 🙂
发音null为unknown 。
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。