我有一系列内存要解析。如果我在结束前找到某个字节序列,我会中断迭代。我想知道我应该选择哪个循环:
while(i < end && !sequenceFound ) {
// parse
i++;
}
或者
for( i; i < end && !sequenceFound; i++ ) {
// parse
}
这用于从实现环形缓冲区的类派生的类的方法。超类提供i
和end
。我的问题是,对于不熟悉代码的人,您认为哪一个更容易理解(表达更好的意图)?
编辑我发现序列是进一步解析流的必要条件。我可以使用break
并设置sequenceFound = true
,但这是多余的,还是我要严格要求?
答案 0 :(得分:6)
为什么不在需要“中断”循环的时候使用break;
。这似乎是大多数惯用语言表达您的意图的语言功能。它通常意味着您可以不使用额外的布尔状态跟踪变量。
如果您需要知道迭代是否提前终止,您可以使用condidition i != end.
无论哪种方式,使用最清晰的控制方法看起来最好,break;
在您想要的位置无论你是否保持“提前退出”变量,对我来说,休息似乎都是最清楚的。进行循环并测试一个你刚刚保证会失败的条件似乎是多余的。
答案 1 :(得分:4)
首选算法手写循环。
#include <algorithm>
auto it = std::find(begin, end, predicate);
if (it == end)
:-(
else
:-)
答案 2 :(得分:3)
对于具有显式限制的迭代,我通常会使用for循环。当迭代没有上限时,应该使用循环。
答案 3 :(得分:3)
对于具有循环变量和结尾的循环(即通过选中i != end
或i < end
来检查在一个范围内运行的所有循环)我赞成for
方法,因为这是更多或减去for
的规范用法。
如果您可能过早地离开循环,break
:
for(; i != end; ++i) {
// parse
if (sequenceFound)
break;
}
答案 4 :(得分:1)
我赞成while
,因为它更好。可能是个人偏好。某些语言版本中的until
也很好。
答案 5 :(得分:0)
第二个版本更适合理解,并允许使用continue运算符。
答案 6 :(得分:0)
如果我在每次迭代之前要检查多个条件,我通常会使用while循环。
答案 7 :(得分:0)
同意Charles Bailey,因为一旦你在迭代中中断,你就会立即摆脱最直接的循环结构,而不必重新评估一个条件变量。此外,您不需要额外的条件变量,从而减少(略微)代码块运行所需的内存。
答案 8 :(得分:0)
我更喜欢内部为for
的{{1}}。
原因是你可以避免那些必须检查你的“休息”条件的丑陋构造,例如:
break
但是对于while版本或者内置条件的for,当然取决于你正在做什么,你不能轻易避免这种条件。