Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我们应该尽量减少循环中的中断和继续使用?_C++_C - Fatal编程技术网

C++ 为什么我们应该尽量减少循环中的中断和继续使用?

C++ 为什么我们应该尽量减少循环中的中断和继续使用?,c++,c,C++,C,当我还是大一新生时,我们的讲师允许我们在循环中使用break或continue。因为它终止/继续循环,所以我大部分时间都是这样做的。现在我已经上大二了,我的老师告诉我说使用break/continue是不可取的。你能告诉我为什么吗?顺便问一下,什么会影响中断/继续?一些人认为控制流太复杂是不好的,这意味着像中断、继续和多个返回s这样的事情。原因不是技术上的,但主要是复杂的控制流会使程序更难验证、测试和推理 然而,这在很大程度上取决于风格、个人品味和你的整体结构。对于小的、目的明确的函数,拥有多个

当我还是大一新生时,我们的讲师允许我们在循环中使用
break
continue
。因为它终止/继续循环,所以我大部分时间都是这样做的。现在我已经上大二了,我的老师告诉我说使用
break
/
continue
是不可取的。你能告诉我为什么吗?顺便问一下,什么会影响中断/继续?

一些人认为控制流太复杂是不好的,这意味着像
中断
继续
和多个
返回
s这样的事情。原因不是技术上的,但主要是复杂的控制流会使程序更难验证、测试和推理


然而,这在很大程度上取决于风格、个人品味和你的整体结构。对于小的、目的明确的函数,拥有多个可能的流可能没有什么害处。特别是在C++中,早期退出是一个流行的习惯用法,并且经常使代码更容易遵循。

< P>至少在C中,你不应该使用<代码> Buffe<代码>和/或<代码>继续<代码> >(大部分时间)(就像你的问题说你曾经做过的那样)来控制循环的流程。您的循环条件应指示循环应在什么情况下停止;维护代码的人不必在循环体中挖掘代码,以查看是什么触发了导致循环停止的
break

例如,假设您要从文件
inputFile
中读取多个整数,以查看其中一个整数是否为500。构建循环的一种方法是:

while (fgets (buffer, sizeof (buffer), inputFile)){
    sscanf (buffer, "%d", &num);
    if (num == 500)
       break;
}
在这里,阅读代码的人必须在循环时阅读整个
,以了解您在文件中实际查找的内容。如果您编写此代码时未使用
中断符

while ((num != 500) && fgets (buffer, sizeof (buffer), inputFile)) 
    sscanf (buffer, "%d", &num);
循环条件本身确切地告诉读者您的代码要做什么,这使它更容易快速理解。另外,作为奖励,您还保存了几行代码

现在想象一个更复杂的
while
for
循环,其中
中断
被深埋在循环体内部。很容易理解为什么试图找到
break
触发器会让人恼火。拥有一个结构合理的循环条件更像是自我记录


当然,在某些情况下,
break
continue
实际上是编写代码的好方法。例如,如果循环结束的条件可能发生在循环执行的中间,并且在循环内有一长串语句,并且执行这些语句将增加处理时间而不需要完成任何有用的操作,当然,继续使用<代码>中断< /代码>。但是这些情况是例外,而不是“大多数时候”。我见过的关于代码正确性推理的大多数逻辑 假设为单入口/单出口。如果你的循环被填满了 有了
中断
继续
,就不可能知道了 是否满足循环不变量,或者是否始终 进步(因此循环不会是无止境的)。(请注意,
do
{…}while(…);
循环也会受到此影响;循环 不变量不是第一次建立的,这可能 (这会导致一些意外。)

大多数情况下,您可能会尝试使用
break
继续
,您可能已经完成了循环(和函数 包含它)太大太复杂

有些人会说:

for (;;) {
    //  ...
    if ( conditionMet ) {
        break;
    }
    //  ...
}
可以接受经典的循环半习惯用法;信息技术 毕竟是单进单出,即使出口不是 这正是我们所期望的(阅读时很难找到) 代码)。关于循环不变量的问题仍然存在;这个 如果在<代码>之前未满足,至少第一次通过。 通常,更好的解决方案是将代码放在 测试到一个单独的函数中,该函数返回
conditionMet
,并且 使用:

(通常,如果循环超过三行或四行,则 应该重构。除非它包含一个
开关

陈述,有很多案例。)

他不能告诉你为什么吗?这不就是他来的目的吗?首先他们来是为了
goto
,而我没有说话,因为我没有使用
goto
。然后他们来了
continue
break
,我没有说话,因为当时我在避免循环。然后,他们来找我……)“政治正确性疯狂”,你经常可以把一个连续的语句变成if语句。作为一个写了一百万行C++代码的人,我仍然使用循环中的中断和继续。不过,我绝大多数时候肯定不会这样做。如果我不得不猜测,我会说它更像是100个循环中的1个。特别是在C++中,早期退出是一个流行的习惯用法,并且经常使代码更容易跟随。并且C++程序可以有非常复杂的流程,即使只有一个代码>返回< /C>语句:许多析构函数可以在那之后运行。更不用说例外了。但是,就像所有的东西一样,在中间使用它。@ T.Seop.Is:嗯,是的,这就是问题:C++支持语言的早期退出。我认为OP的建议主要适用于C。例如,我认为MISRA C规则要求单次申报。@KerrekSB是的,规则14.7,在一次申报中只应定义一个退出点function@ta.speot.is我不知道你从哪里得到的。我已经编程C++超过25年了,我从来没有使用过<代码>破解< />代码或<代码>继续<代码>(甚至更少的<代码>返回<代码>)。正如Kerrek所说,这使得关于代码正确性的推理变得非常困难。下行投票者能给我一个解释吗?我不是下行投票者,但我认为你的观点是相当沉默的:你用一个邪恶(一个
break
)交换另一个邪恶(一个过于复杂的循环条件)。对我来说
while ( doLoopPrefix() ) {
    doLoopSuffix();
}