从C ++中的for循环错误实践返回函数值?

时间:2016-09-29 09:29:33

标签: c++ function loops control-flow principles

我的同事刚刚查看了我的代码并说,根据"某些标准"从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. 如果是这样的话:为什么?

4 个答案:

答案 0 :(得分:2)

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

据说,一般来说,这是不错的做法

  

a)禁止此的标准?

没有

  

b)这是一种令人着迷的不良做法吗?

没有

c)问题已经得到解答。

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

你想在循环你的字符串后返回true,那你怎么能在循环中优雅地做呢?使用if语句说如果它是最后一次迭代,则在循环结束时返回true

我认为这会在您的文件中添加更多代码行,没有任何理由,严重损害了可读性。

答案 1 :(得分:2)

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

这种想法主要来自C,通过单点退出函数可以很有意义,以确保在退出时正确清理函数最终获取的资源。在多个出口处复制这种清理被认为是脆弱的并且难以维护 - 我同意。

在C ++中,控制资源的首选方法是通过RAII或使用RAII类,如共享指针,stringvector。因此,在退出时清理资源所需的代码量通常为null,因为它是在本地作用域中的对象的析构函数中隐式完成的。因此,除非你有充分的理由这样做,否则通常没有任何意义强制执行单一进入/单一退出。

答案 2 :(得分:0)

对此可以有不同的看法,人们可能会认为这会导致“不直观”的控制流程。但是这有没有标准

就个人而言,我发现这比一个额外的变量和条件退出代码更好。您希望在此时离开范围,并通过从函数返回来执行此操作。我有时甚至将代码放在一个额外的函数中,只是为了能够使用从任何地方离开范围的功能返回。

这也具有创建更少代码行的优势。并且更少的代码行引入错误的机会较少。

答案 3 :(得分:0)

在某些编码标准中,您可以找到“函数应该只有一个退出点”之类的内容。这通常与清理程序有关,但在智能指针的时代,这不再适用了。

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

更多:我会说你不需要'else',因为如果退出循环/函数,处理只会在'else'情况下继续。在你的情况下并不重要,但如果你有多个ifs,它可以为你节省很多麻烦。