8

两个条件(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 从未被测试过。

但是第一个条件必须反转结果....

4

3 回答 3

9

它并不那么简单。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) 

这当然永远不会失败。要理解 && 运算符为什么比 & 运算符效率低得多,您必须了解分支预测这个答案很好地涵盖了这一点。

于 2013-08-04T00:49:12.993 回答
3

两者都不。它们都具有完全相同的短路行为,编译器会将两者都转换为 MSIL 请求测试A,然后是条件分支。为 true的分支A将测试B.

你应该担心的是:

!(A && B)

对比

!(B && A)

在情况AB导致副作用或复杂计算的情况下有所不同。

两者相同的可能例外是如果您有自定义定义operator!,在这种情况下,它们实际上根本不等效。

于 2013-08-03T21:15:00.160 回答
-1

我对两者之间的 10000 次比较的简短测试表明,firsoneis 更快。

它说第一个总共需要 1353 个刻度,第二个总共需要 1373 个刻度。

编辑:然后我又试了几次,结果各不相同,所以它们都是一样的。

于 2013-08-03T21:16:03.183 回答