准则:而vs

Mat*_* M. 6 c++ coding-style

免责声明:我试图搜索类似的问题,但是这回复了每个C++问题......我也会感激任何能提出更好标题的人.

C++中有两个突出的循环结构:whilefor.

  • 我有意无视do ... while构造,它是无与伦比的
  • 我知道std::for_each并且BOOST_FOREACH,但不是每个循环都是for each

现在,我可能有点紧张,但它总是让我纠正这样的代码:

int i = 0;
while ( i < 5)
{
  // do stuff
  ++i; // I'm kind and use prefix notation... though I usually witness postfix
}
Run Code Online (Sandbox Code Playgroud)

并将其转换为:

for (int i = 0; i < 5; ++i)
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

for在我看来,这个例子的优点是多重的:

  1. 局部性:变量i仅存在于循环范围内
  2. :循环'控件'是打包的,所以只看循环声明我可以判断它是否正确形成(并将终止...),当然假设循环变量未在体内进一步修改
  3. 它可能是内联的,但我并不总是建议它(这会产生棘手的错误)

我有一种倾向,因此不要使用while,除了while(true)成语,但这不是我曾经使用过的一段时间(双关语).即使在复杂的条件下,我也倾向于坚持for构造,尽管在多行上:

// I am also a fan of typedefs
for (const_iterator it = myVector.begin(), end = myVector.end();
     it != end && isValid(*it);
     ++it)
{ /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)

while当然,您可以使用a来执行此操作,但之后(1)和(2)将无法验证.

我想避免"主观"的评论("我喜欢/更好"的那种),我对参考现有的编码指南/编码标准非常感兴趣.

编辑:

我倾向于尽可能地坚持(1)和(2),(1)因为建议使用地点>> C++编码标准:项目18和(2)因为如果我不需要,它使维护更容易扫描整个循环以查找控制变量的可能更改(for当第3个表达式引用循环变量时,我认为这是理所当然的).

但是,gf如下所示,虽然有它的用途:

while (obj.advance()) {}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一种咆哮,while而是试图根据手头的情况找出哪一个whilefor使用(并且出于合理的原因,而不仅仅是喜欢).

Geo*_*che 7

并非所有循环都用于迭代:

while(condition) // read e.g.: while condition holds
{
}
Run Code Online (Sandbox Code Playgroud)

没关系,虽然这感觉很难:

for(;condition;)
{
}
Run Code Online (Sandbox Code Playgroud)

您经常会看到任何输入源.

您可能还有隐式迭代:

while(obj.advance())
{
}
Run Code Online (Sandbox Code Playgroud)

再次,它似乎被迫与.

此外,当强迫for而不是while,人们往往滥用它:

for(A a(0); foo.valid(); b+=x); // a and b don't relate to loop-control
Run Code Online (Sandbox Code Playgroud)

  • "并非所有循环都用于迭代" - 是的,它们是!这就是迭代的定义.迭代意味着重复.我认为你的意思是并非所有循环都有一个控制递增或递减变量. (2认同)