所以我在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;
}
}
然而,while (true)
似乎......对我很怀疑。我知道这段代码有效,从逻辑上讲我知道它应该有效。但是,我无法摆脱while
中应该存在某些条件的感觉,但实际上唯一可能的是使用bool
变量来说明它是否已完成。我应该不要担心吗?或者这是非常糟糕的形式。
编辑:感谢大家注意到有办法解决这个问题。但是,我仍然想知道是否还有其他有效案例。
答案 0 :(得分: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;
这似乎表达了循环的真正意图
答案 1 :(得分:13)
我的两分钱是:代码应该是self-documenting。也就是说,当给出一段代码时,我宁愿能够查看并告诉程序员的意图,然后必须阅读注释或在周围的代码中跋涉。当我读到:
while(true)
这告诉我程序员想要一个无限循环;无法指定结束条件。这是程序员在某些情况下的意图;例如,服务器循环,也就是应该使用它。
在上面的代码中,循环并不是永远的,它有一个明确的结束条件,并且为了在语义上清晰,正如其他人指出的那样:
while (currentVal != searchVal)
有效,所以while(true)明显较低,在这种情况下应该避免。
答案 2 :(得分:6)
有无限循环的时间和地点 - 我不相信这是其中之一。另一方面,这远不是一个令人震惊的问题。
while (currentVal != searchVal)
{
...
}
return true;
使用它们的一个地方是当进程真正无限期时 - 一个带有监视器循环但不会终止的守护进程。
答案 3 :(得分:5)
在某些情况下,这样的结构是有意义的:
答案 4 :(得分:5)
我同意其他答案,在这种情况下不需要无限循环。
然而,另一点可能是当做有无限循环时,for(;;)
可能是更好的表达方式。有些编译器会为while(true)
生成警告(条件总是计算为false),并且您的意图不太明确,因为它看起来像任何其他循环。也许过去常说while (x == true)
,而您意外删除了x
而不是true
。 for(;;)
非常清楚地表明这是一个无限循环。或者你打算写一些像while(t)
这样的东西,但你的IDE中的Intellisense开始了,并决定自动完成true
。
for(;;)
不是你偶然输入的东西。 (并且搜索更容易。而(true)也可以写成while(1))
这两个版本错误,但for(;;)
可能更直观,因为 没有循环条件。
答案 5 :(得分:4)
while(true)
用于主游戏循环的游戏 - 游戏不断读取玩家输入,处理对象之间的交互并绘制屏幕,然后重复。这个循环无限延续,直到某个其他动作突破该循环(退出游戏,完成关卡)。
我试图在Quake 1源代码中快速找到这个主循环,但至少有50次出现“while(1)
”,还有一些写成“for(;;)
”,我并不是很确定哪一个是主要的游戏循环。
答案 6 :(得分:1)
虽然我之前已经完成了这些工作,但是我总是试图通过使用可读的东西来寻求更清晰的解决方案,这通常包括while循环中的有效表达式 - 否则你会扫描代码来查找为了休息。
我并不是真的害怕他们或任何事情,但我知道有些人。
答案 7 :(得分:0)
好吧,评论说这不是一个无限循环会有所帮助:
while (true) // Not really an infinite loop! Guaranteed to return.
我同意它应该有一个条件,但在某些情况下这是可以的(并不总是可能或很容易制造一个条件)。
答案 8 :(得分:0)
不要担心。如果它有助于简化代码的逻辑并提高可维护性和可读性,那么这种形式也不错。值得注意的是,在关于预期退出条件的评论中以及为什么算法不会陷入无限循环中。
答案 9 :(得分:0)
好吧,是,但是如果你不希望你的主循环类似于while(true)
那么你必须编写的两页代码甚至更糟 form。
答案 10 :(得分:0)
在嵌入式系统代码中找到无限循环并不罕见 - 通常围绕有限状态机,检查外围芯片和设备等。
答案 11 :(得分:0)
我喜欢无限循环作为有限状态机的外部控制结构。它实际上是一个结构化的转到:
for (;;) {
int c = ReadInput();
if (c == EOF)
return kEOF;
switch (state) {
case inNumber: state = HandleNumber(c); break;
case inToken: state = HandleToken(c); break;
case inWhiteSpace: state = HandleWhiteSpace(c);
default:
state = inError;
break;
}
if (state == inError) ThrowError();
}