2

我想知道这两种解决方案中的一种是否比另一种更好:

版本 1:

bool myFunction()
{
    if (A)
        return false;
    if (B)
        return false;
    if (C)
        return false;
    if (D)
        return false;

    return true;
}

版本 2:

bool myFunction()
{
    return (!A && !B && !C && !D);
}

我猜测版本 2 的效率可能会低一些,因为我们可能必须计算整个布尔表达式才能知道它是真还是假。在第一个版本中,如果 A 为假,则返回假,不计算 B、C 或 D。但我发现第二个版本更具可读性。

那么最好的方法是什么?

谢谢你。

4

3 回答 3

6

在第一个版本中,如果 A 为假,则返回假,不计算 B、C 或 D。

第二个版本也是如此。&&运算符是短路的-如果第一个操作数是false,它不会评估第二个操作数。

但是,我要么从第二个版本中删除括号:

return !A && !B && !C && !D;

或将其反转为:

return !(A || B || C || D);

...取决于您觉得哪个更容易阅读。我个人更喜欢尽可能少的否定。(||也是短路的,所以它们在效率上是等效的。)

请注意,原则上不要避免使用多个 return 语句 - 很多时候使用多个 return 语句可以提供更具可读性的代码。尽可能地寻找最易读的代码,只有当你证明最易读的方法不能像你需要的那样执行时才担心效率。在这种情况下,这些方法同样有效,因此无论如何这都不是问题。

于 2013-09-28T09:49:01.900 回答
4

这取决于。他们都做同样的事情。

如果你的函数真的只是返回变量和逻辑运算的简单组合,那么就去吧return !A && !B && !C && !D;(括号是不必要的)。

但是,如果您正在进行冗长而复杂的计算,那么:

  1. 考虑重构您的代码,使一个函数实际上不能完成 4 个函数的工作;

  2. 如果一切都失败了,请插入多个 return 语句。它没有那么坏。不惜一切代价强制执行单个退出点是一种愚蠢的编码约定。在某些情况下(尤其是错误处理),允许多个返回语句确实可以使代码可读。

于 2013-09-28T09:50:54.810 回答
0

来自 ISO/IEC 9899:

6.5.13 逻辑与运算符

4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

而这个用于c ++:

从 N1905=05-0165

5.14 逻辑与运算符

1 && 运算符从左到右分组。操作数都被隐式转换为 bool 类型(第 4 条)。如果两个操作数都为真,则结果为真,否则为假。与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

所以在这两种情况下都不必计算整个表达式

于 2013-09-28T09:54:24.453 回答