具有多个 if 或具有"big"返回的函数?

Function with multiple if or with a "big" return?

本文关键字:函数 返回 if big      更新时间:2023-10-16

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

版本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 为 false,则返回 false,而不计算 B、C 或 D。但我发现第二个版本更具可读性。

那么最好的方法是什么呢?

谢谢。

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

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

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

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

或将其反转为:

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

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

请注意,原则上不要避免多个 return 语句 - 很多时候使用多个 return 语句会提供更具可读性的代码。尽可能使用最具可读性的代码,并且只有在证明最易读的方法没有达到您需要的效果时才担心效率。在这种情况下,这些方法同样有效,因此无论如何这都不是问题。

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

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

但是,如果您正在执行长而复杂的计算,则:

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

  2. 如果其他所有操作都失败,请插入多个返回语句。没那么糟糕。不惜一切代价强制实施单个退出点是一种愚蠢的编码约定。在某些情况下,允许多个返回语句确实可以使代码可读(特别是错误处理(。

来自 ISO/IEC 9899:

6.5.13 逻辑 AND 运算符

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

而这个用于 c++ 的:

从 N1905=05-0165

5.14 逻辑 AND 运算符

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

因此,在这两种情况下,它都不必计算整个表达式