免责声明:我试图搜索类似的问题,但这回复了每一个C问题……我也会感激任何可能提出更好标题的人.
C中有两个显着的循环结构:while和for.
>我故意忽略了do … while结构,它是无与伦比的
>我知道std :: for_each和BOOST_FOREACH,但不是每个循环都是一个
现在,我可能有点紧张,但它总是让我纠正这样的代码:
int i = 0; while ( i < 5) { // do stuff ++i; // I'm kind and use prefix notation... though I usually witness postfix }
并将其转换为:
for (int i = 0; i < 5; ++i) { // do stuff }
在我看来,在这个例子中for的优点是多重的:
>局部性:变量i仅存在于循环范围内
> Pack:循环’控件’是打包的,所以只看循环声明我可以判断它是否正确形成(并将终止…),当然假设循环变量未在体内进一步修改
>它可能是内联的,但我不会总是建议它(这会产生棘手的错误)
我有一种倾向,因此不要使用while,除了可能是为了while(真)成语,但这不是我曾经使用过的一段时间(双关语).即使对于复杂的条件,我倾向于坚持使用for构造,尽管在多行上:
// I am also a fan of typedefs for (const_iterator it = myVector.begin(),end = myVector.end(); it != end && isValid(*it); ++it) { /* do stuff */ }
当然,你可以暂时这样做,但是(1)和(2)将无法验证.
我想避免“主观”的评论(“我喜欢/更好”的那种),我对参考现有的编码指南/编码标准非常感兴趣.
编辑:
我倾向于尽可能地坚持(1)和(2),(1)因为推荐了地点>> C++ Coding Standards: Item 18,以及(2)因为如果我不必扫描整个循环来寻找控制变量的可能改变(当第3个表达式引用循环变量时我使用for作为理所当然),它使维护更容易.
但是,如下面的gf所示,虽然有它的用途:
while (obj.advance()) {}
请注意,这不是一种咆哮,而是试图根据手头的情况(并且出于合理的原因,而不仅仅是喜欢)找到while或者使用中的哪一个.
解决方法
并非所有循环都用于迭代:
while(condition) // read e.g.: while condition holds { }
没关系,虽然这感觉很难:
for(;condition;) { }
您经常会看到任何输入源.
您可能还有隐式迭代:
while(obj.advance()) { }
再次,它似乎被迫与.
此外,当强迫而不是一时,人们倾向于滥用它:
for(A a(0); foo.valid(); b+=x); // a and b don't relate to loop-control