是否从 C++ 中的 for 循环不良做法返回函数值?

Is returning a functions value from a for-loop bad practice in C++?

我的同事刚刚看了我的代码并说,根据 "some standard" 从 for 循环返回函数值是不好的做法。

函数看起来像这样:

bool CentralWidget::isBitFieldFree(const QString& define, int lsb, int msb)
{
    QString defineWithoutIndex = getDefineWithoutIndex(define);
    for (int i = lsb; i <= msb; i++)
    {
        if ((registerBitMap[defineWithoutIndex] >> i) & 1)
            return false; //Returning here early...
        else
            registerBitMap[defineWithoutIndex] |= 1 << i;
    }
    return true;
}

问题:

  1. 是否有禁止这样做的标准?
  2. 这是公认的不良做法吗?
  3. 如果是这样:为什么?

的世界里没有这样的标准。但是,在更具体的环境(例如公司)中,可能适用专门的标准。

话虽如此,总的来说,这并不是什么坏习惯


a) a standard that bans this?

没有

b) is this concidered bad practice?

没有

c) 问题已经回答。


除此之外,它属于个人喜好范围,这是我的-但这显然不是真正答案的一部分:

你想要 return true,在你对你的字符串进行循环之后,那么你怎么能在循环中优雅地做到这一点呢?使用 if 语句表示如果它是最后一次迭代,return true,在循环结束时?

我认为这会无缘无故地在您的文件中放置更多代码行,并严重损害可读性。

对此可能会有不同的看法,人们可能会争辩说它构成了 "unintuitive" 控制流。但是没有标准

我个人认为这比使用额外的变量和条件来退出代码更好。此时您想离开范围,您可以通过 returning 从函数中执行此操作。有时我什至将代码放在一个额外的函数中,只是为了能够使用 return.

从任何地方离开范围的功能

这还具有创建更少代码行的优点。代码行越少,引入错误的机会就越少。

有一种学派认为函数应该有一个入口点和一个出口点。这使得代码的一些静态分析更容易,但在 C++ 中很可能没有其他目的。

这种想法主要来自 C,其中通过单点退出函数以确保函数最终占用的资源在退出时得到正确清理非常有意义。跨多个出口复制这种清理被认为是脆弱且难以维护的——我同意。

然而,在 C++ 中,控制资源的首选方法是通过 RAII 或使用 RAII-类,如共享指针,stringvector。因此,在退出时清理资源所需的代码量通常为空,因为它是在局部范围内的对象的析构函数中隐式完成的。因此,除非您有充分的理由,否则强制执行 single-entry/single-exit 通常没有任何意义。

在某些编码标准中,您可以找到 'a function should have only one exit point' 之类的内容。通常这与清理程序有关,但在智能指针时代这不再适用。

因此,正如其他答案和评论所说:不,没有这样的标准。 另外,我不认为这是不好的做法。

甚至更多:我会说您不需要 'else',因为如果您退出 loop/function,处理只会在 'else' 情况下继续。在你的情况下无关紧要,但如果你有多个 if,它可以为你节省很多嵌套。