两个条件(a和b)的NAND逻辑门是true只要其中一个条件是真的,或者没有一个条件是真的;如果两个条件都是真的,则false逻辑门是if(A)的。

F NAND F = T
F NAND T = T
T NAND F = T
T NAND T = F

我至少可以用两种方式来写:
!(A && B)


(!A || !B)

哪个更有效?
在我看来,if(!A)然后b总是被测试,然后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!带着不确定的幻想。
对于nand门来说,这从来都不是问题,当第一个输入是f时,它不会崩溃:)有很多可能的c表达式,但这不是问题。你真的应该帮我接电话。这有很大的不同。所以一定要这样写:
if (ix >= 1 & ix <= 42)

这当然不会失败。要理解为什么&&operator比&&operator效率低得多,您必须了解分支预测。这在this answer中涵盖得很好。

08-16 01:36