C# 微软更喜欢虚假价值?
我在读乔恩·斯基特的书。(#4) 但有一件事(除其他外)引起了我的注意: 主题:布尔 他在一张表格中写道:(X,Y是布尔?) 好吧,好吧。。。所以空值是决定的那个。 这里的布尔操作数丢失C# 微软更喜欢虚假价值?,c#,.net-4.0,nullable,boolean-logic,C#,.net 4.0,Nullable,Boolean Logic,我在读乔恩·斯基特的书。(#4) 但有一件事(除其他外)引起了我的注意: 主题:布尔 他在一张表格中写道:(X,Y是布尔?) 好吧,好吧。。。所以空值是决定的那个。 这里的布尔操作数丢失 X | Y | X & Y --------------------------- false null false 为什么? 为什么这里要考虑bool操作数,而在上一个示例中,决定结果的是null 似乎真与假在不同的地方有朋友……:)根据微软的说法,
X | Y | X & Y
---------------------------
false null false
为什么?
为什么这里要考虑bool操作数,而在上一个示例中,决定结果的是null
似乎真与假在不同的地方有朋友……:)根据微软的说法,它是 确保&和|运算符生成的结果与SQL中的三值布尔类型一致
.之所以这样设计,是为了与许多其他平台(包括SQL)中实现的一致。在Kleene逻辑(三值逻辑的基础)中,
真和未知
给出未知
,而假和未知
给出假
关于C#中结果的解释和列举,您可以参考标题为“内”的部分。将null宣布为未知
当然,还有一个镜像表,用于或:
true | unknown => true because the second operand does not matter.
false | unknown => unknown
它也适用于
&&
和|
对&&和| |运算符都根据进行评估。这意味着一旦一个复杂表达式被确定为false,其余的表达式将不会被检查。由于第二个表达式中的false值足以确定逻辑AND的结果,因此直接将结果确定为false。原因是您现在正在处理
- 对于AND运算符(无论是&还是&),表达式结果可以在第一次匹配FALSE时确定
- 对于OR运算符(无论是|还是| |),表达式结果可以在第一次匹配TRUE时确定
- 对于任何最左边为NULL的布尔运算,操作数将返回NULL
null运算符null
组合,则有9种)
以及:
或:
使用你的
朋友
类比,你可以说,对于三值逻辑,你倾向于将FALSE和NULL作为结果,而OR倾向于TRUE和NULL。有关详细信息,请参阅真值表。我认为这可能是基本原理,但不确定。这不是,这是一种用户定义的转换。这与|
相反:null | | true==true
我认为在使用位运算符时,两个操作数都很重要?@haiyyu-两个操作数都会被计算,但false&x
总是false,x
是否为真、假或未知。请注意,短路电路评估
(for&&和| | |)与表达式的结果无关。当结果可以确定时,短路求值仅停止求值子表达式,而正常求值始终求值所有子表达式,无论是否仍然需要它们的结果。
true & unknown => unknown
false & unknown => false because the second operand does not matter.
true | unknown => true because the second operand does not matter.
false | unknown => unknown
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