两个条件(A 和 B)的NANDtrue
逻辑门只要其中一个条件为真,或者没有一个条件为真;如果两个false
条件都为真。
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# 语言根本不使用 && 运算符来模拟 NAND 门。该运算符具有短路行为,在 C# 程序中非常方便。以及花括号语言的常见行为,这样的表达式不会使您的代码崩溃:
arr[] = somefunction();
int ix = foo;
if (ix < arr.Length && arr[ix] == 42) {
EmailBookRecommendation();
}
但这是表达式的一个非常低效的版本,这个版本的性能更高:
if (ix < arr.Length & arr [ix] == 42)
这是一个完全合法的表达式,& 运算符与布尔操作数一起工作得很好。但不幸的是,这会使您的代码崩溃。它评估数组索引表达式,然后 Kaboom!与 IndexOutOfRangeException。
与非门从来都不是问题,当第一个输入是 F 时它不会崩溃 :) 有许多可能的 C# 表达式,这不是问题。你真的应该支持那些 & 运算符。它有很大的不同。所以总是这样写:
if (ix >= 1 & ix <= 42)
这当然永远不会失败。要理解 && 运算符为什么比 & 运算符效率低得多,您必须了解分支预测。这个答案很好地涵盖了这一点。
两者都不。它们都具有完全相同的短路行为,编译器会将两者都转换为 MSIL 请求测试A
,然后是条件分支。为 true的分支A
将测试B
.
你应该担心的是:
!(A && B)
对比
!(B && A)
在情况A
或B
导致副作用或复杂计算的情况下有所不同。
两者相同的可能例外是如果您有自定义定义operator!
,在这种情况下,它们实际上根本不等效。
我对两者之间的 10000 次比较的简短测试表明,firsoneis 更快。
它说第一个总共需要 1353 个刻度,第二个总共需要 1373 个刻度。
编辑:然后我又试了几次,结果各不相同,所以它们都是一样的。