对于C#中的NAND(并非两者都是真的),哪种语法更有效

本文关键字:语法 有效 都是真的 NAND 中的 对于 | 更新日期: 2023-09-27 18:26:00

两个条件(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#中的NAND(并非两者都是真的),哪种语法更有效

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

当然,这永远不会失败。为了理解为什么&amp;运营商的效率比&操作员,您必须了解分支预测。这个答案很好地涵盖了这一点。

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

你应该担心的是:

!(A && B)

!(B && A)

在CCD_ 8或CCD_。

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

我对两者之间的10000次比较进行了简短测试,结果表明firson更快。

报告称,第一次总共需要1353个蜱虫,第二次总共需要1373个蜱虫。

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