两个条件(A和B)的NAND逻辑门为true
,只要其中一个条件为真,或者没有一个条件是真;如果两个条件都为真,则为CCD_ 2。
F NAND F = T
F NAND T = T
T NAND F = T
T NAND T = F
在C#中,我至少可以用两种方式写这篇文章:
!(A && B)
或
(!A || !B)
哪个更高效?
在我看来,if(A)
然后B总是被测试,而if(!A)
然后B从未被测试。
但是,第一个条件必须使结果反转。。。。
这并不是那么简单。C#语言根本不使用&;操作人员该运算符具有短路行为,在C#程序中非常方便。大括号语言的常见行为是,这样的表达式不会破坏代码:
arr[] = somefunction();
int ix = foo;
if (ix < arr.Length && arr[ix] == 42) {
EmailBookRecommendation();
}
但这是一个效率非常低的表达式版本,这个表达式的性能更高:
if (ix < arr.Length & arr [ix] == 42)
这是一个完美的法律表达;运算符和布尔操作数配合得很好。但不幸的是,这一次破坏了您的代码。它评估数组索引表达式,然后转到Kaboom!具有IndexOutOfRangeException。
NAND门从来都不是问题,当第一个输入是F时它不会崩溃:)有许多可能的C#表达式,这不是问题。你真的应该支持&操作员。它产生了巨大的差异。所以总是写这样的东西:
if (ix >= 1 & ix <= 42)
当然,这永远不会失败。为了理解为什么&;运营商的效率比&操作员,您必须了解分支预测。这个答案很好地涵盖了这一点。
两者都没有。它们都有完全相同的短路行为,编译器会将两者转换为MSIL,请求测试A
,然后是条件分支。A
为真的分支将进行B
的测试。
你应该担心的是:
!(A && B)
与
!(B && A)
在CCD_ 8或CCD_。
两者相同的可能例外是,如果您有operator!
的自定义定义,在这种情况下,它们实际上根本不等价。
我对两者之间的10000次比较进行了简短测试,结果表明firson更快。
报告称,第一次总共需要1353个蜱虫,第二次总共需要1373个蜱虫。
编辑:然后我又试了几次,结果各不相同,所以都是一样的。