rlb*_*ond 7 c++ language-agnostic coding-style infinite-loop
所以我在BFS算法中有一些用于反向跟踪节点的C++代码.看起来有点像这样:
typedef std::map<int> MapType;
bool IsValuePresent(const MapType& myMap, int beginVal, int searchVal)
{
int current_val = beginVal;
while (true)
{
if (current_val == searchVal)
return true;
MapType::iterator it = myMap.find(current_val);
assert(current_val != myMap.end());
if (current_val == it->second) // end of the line
return false;
current_val = it->second;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,while (true)似乎......对我怀疑.我知道这段代码有效,从逻辑上讲我知道它应该有效.但是,我不能感觉到应该有一些条件的感觉while,但实际上唯一可能的是使用一个bool变量来说明它是否已经完成.我应该不要担心吗?或者这是非常糟糕的形式.
编辑:感谢所有人注意到有办法解决这个问题.但是,我仍然想知道是否还有其他有效案例.
Jar*_*Par 22
我相信在某些情况下,看似无限的循环存在是好的.然而,这似乎不是其中之一.看起来您可以轻松编写如下代码
while (current_val != searchVal ) {
MapType::iterator it = myMap.find(current_val);
assert(current_val != myMap.end());
if (current_val == it->second) // end of the line
return false;
current_val = it->second
}
return true;
Run Code Online (Sandbox Code Playgroud)
这似乎更好地表达了循环的真实意图
Tod*_*ner 13
我的两分钱是:代码应该是自我记录的.也就是说,当给出一段代码时,我宁愿能够查看并告诉程序员的意图,然后必须阅读注释或在周围的代码中跋涉.当我读到:
while(true)
Run Code Online (Sandbox Code Playgroud)
这告诉我程序员想要一个无限循环; 无法指定结束条件.这是程序员在某些情况下的意图; 例如,服务器循环,也就是应该使用它.
在上面的代码中,循环并不是永远的,它具有明确的结束条件,并且为了在语义上清晰,正如其他人指出的那样:
while (currentVal != searchVal)
Run Code Online (Sandbox Code Playgroud)
因此,while(true)显然是劣等的,在这种情况下应该避免.
有无限循环的时间和地点 - 我不相信这是其中之一.另一方面,这远不是一个令人震惊的问题.
while (currentVal != searchVal)
{
...
}
return true;
Run Code Online (Sandbox Code Playgroud)
使用它们的一个地方是当进程真正无限期时 - 具有不会终止的监视器循环的守护进程.
我同意其他答案,在这种情况下不需要无限循环.
但是,另一点可能是当你确实有一个无限循环时,for(;;)可能是一种表达它的更好方法.有些编译器会为while(true)(条件总是计算为false)生成警告,并且您的意图不太明确,因为它看起来像任何其他循环.也许它曾经说过while (x == true),你不小心删除了x而不是true.for(;;)很清楚地说,这是一个无限循环.或许你打算写一些类似的东西while(t),但你的IDE中的Intellisense开始并决定自动完成true.
for(;;)另一方面,不是你偶然输入的东西.(并且搜索更容易.而(true)也可以写成while(1))
无论是版本是错误的,但for(;;)因为可能有更直观的是没有循环的状态.