里面带有“ break”的“ while(true)”循环的术语是什么?[关闭]


24

假设我在C ++或C#中有一个循环,如下所示:

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

这通常称为“无限循环”。但是从技术上讲,它不是无限的-一旦控制流过,它将停止break

这种循环的术语是什么-内部具有“永远循环”循环控制语句和“ break”?


22
我认为没有特别的名词。
克里斯·弗雷德

2
是否可以保证控制将始终通过中断?在该示例中,如果condition()始终返回false怎么办?我会说这是一个有条件中断的无限循环。
JohnL

1
即使没有break,循环也不是无限的(kill,ctrl-alt-del,拔出...)。那么,为什么还要打扰术语细节呢?
mouviciel 2011年

5
“什么意思?” -“这通常称为无限循环”。那就是你的答案。您显然对这个术语不满意,但这并不能消除(自然)语言具有描述性的事实。“ X的术语”是人们正在使用的东西,而不是他们应该使用的东西。
MSalters 2011年

5
这个问题似乎是题外话,因为它是一个“给那个东西命名”的问题。“为事物命名”是坏问题,其原因与“通过角色或故事来识别这部晦涩的电视节目,电影或书籍”的原因相同:您不能用Google搜索,它们在任何方面都不实用,不要帮助其他人,并允许他们为提出其他类型的边际问题敞开大门。见blog.stackoverflow.com/2012/02/lets-play-the-guessing-game
蚊蚋

Answers:


24

在学习CS时,这位教授告诉我们,有预检查循环while(cond) {}),后检查循环do {} while(cond);)和中检查循环。(我可能已将其翻译成英文,但您明白了。)

C和C ++没有后者(ISTR Ada拥有,BICBW),因此您的构造用于C和C ++。


1
是的,艾达(Ada)拥有:loop ... exit when condition; ... end loop;
基思·汤普森

@Keith:感谢您的确认!自从我做了一些Ada以来已经快20年了。
2011年

1
就其价值而言,我已经成为一名专业程序员已有20多年了(并且业余时间更长),而且我从未听说过这些术语。
offby1 2011年

关于翻译-我认为使用“前置”和“后置”时,例如“前置/后置/有序树遍历”,“输入”通常更合适。
橡树

1
我长大的那个词是“中间退出循环”。我已经使用了几种不同的语言来为中间退出循环提供明确支持。
mjfgates 2011年

13

斯坦福大学CS课程的第一门课程(Mehran Sahami的编程方法论)将此称为半循环。并不一定是不好的编程习惯。考虑一下收集用户输入的示例(摘自Eric Roberts的Java艺术与科学,Roberts也称其为a-loop-and-a-half):

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

然后使用循环半想法解决了同一件事,避免了重复的代码:

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}

10

缺少正式名称,我称之为“ 断环”。这个术语的意思是模棱两可的,因为循环中间的中断有点不干净,几乎就像一个goto


我会说,这比goto还要糟糕。我宁愿在这样的循环中看到goto而不是虚假构造的条件。
Brian Knoblauch

14
@Brian什么?“真实”条件使其变得显而易见,并且像这样的循环确实很常见。例如,如果要将文件的每一行添加到列表中,则必须尝试读取该行(执行某些操作),如果失败则停止(如果条件中断),否则将其添加到列表中并重复执行(执行某些操作)其他)。
Craig Gidney

7
循环中间没有任何问题。如果需要在循环的每个开始时执行某些操作,则必须复制代码或将这些操作填充到条件中。每种变体显然都有缺点。goto也有有效的应用程序,例如模拟try ... finally块在C
Malcolm,

1
Malcolm:可能的问题是,在阅读代码期间,很难看到退出循环的时间和原因。当您嵌套两个或多个这样的循环,并希望根据内部循环中发现的条件脱离外部循环时,还会出现其他问题。
user281377 2011年

假设您有一个驱动Xorg应用程序的事件循环,例如(使用伪代码:)while(XEventGet(&ev) != NULL){ ... },您自然会想要检查循环内的键:if(ev.key == XK_q) break;。请执行以下操作:while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... },而且比中循环中断难看而且说起来很难。另外,如果需要先对值进行某些操作然后再进行检查,该怎么办?您不会认真地将所有内容都放入循环的基本案例中,对吗?
Braden Best

8

没有明确的名称。我认为,无限循环是合适的术语。没有循环是真正无限的,但这有可能实际上是无限的,因为包含中断的分支可能永远不会发生。

如果您告诉某人“创建一个无限循环,并为条件X使用中断”,他们就会知道您的意思。如果某人正在查看您的代码并且只说“我不喜欢您编写的无限循环”,您就会知道他们在说什么(当然,除非您拥有多个)。


1
这不是一个无限循环。它有一个定义明确的终止条件,就像一个正常的while循环一样,终止证明的方式也完全相同(找到单调递减的度量是一个很好的开始)。
Donal Fellows

8

这是一个条件循环在错误位置的执行循环。


2
是的,应该这样写:while(keep_going){doSomething(); if(condition){keep_going = false; }其他{doSomethingElse(); }
斯蒂芬·格罗斯

10
所以...您说的是,如果您正在教授计算机课程并想对此进行描述,您会说:“现在,我们将学习* do-while循环,条件在错误的位置“?这听起来更像是一种宗教见解,而不是名字。
布莱恩·奥克利

5
@StephenGross该代码段是一个可怕的建议。重构以将实际条件放入循环定义中,或仅使用breakcontinue。不惜一切代价避免哨兵值,它们只是精神上要跟踪的另一种状态,掩盖了代码的目的。
Izkata 2011年

2
信度值是延迟的错误。
温斯顿·埃韦特

2
-1为单出差。
Donal Fellows

6

我会投票给“无条件循环”,类似于“无条件跳转”。它准确地说明了正在发生的事情(代码无条件循环),而没有说谎(与“无限循环”不同)。


1
但是它确实有终止条件。该if/ break在中间是图形的一部分。
Donal Fellows,2012年

5

这种循环的术语是什么-内部具有“永远循环”循环控制语句和“ break”?

它是带有中断条件的无限循环。

我同意ammilind的观点,即如果您想给它一个特殊的名称,则可以将其称为无限部分循环


1
根本不是无限的。检查终止条件的点位于另一个位置。
Donal Fellows

5

在Rosetta Code上,此特定模式被描述为“ N加一半”循环。虽然这不是我最喜欢的术语,但它并不可怕,并且显然是一种对某些循环有用的模式。(替代方案是复制条件之前的代码(在实际程序中可能很棘手),或者在添加循环条件变量的同时增加条件后代码的嵌套深度;既不能提高代码的可维护性,也不能提高代码的可理解性拒绝此类构造的唯一原因是,如果有人坚持要求编写循环是自由的break。)


4

没有标准术语,但是我会说它是Partial loop

如果只想在最后一次执行循环的某个部分(即部分执行)后才中断,则使用此循环。当您找不到合适的情况来中断整个循环时,可以使用它

在这种情况下,您要在至少doSomething()最后一次执行一次之后中断循环。


2

我必须在这里同意sbi-我喜欢中间检查循环术语。当结构化编程开始流行并且许多语言都对其提供了语法支持时,这种构造更加流行。

就是说,现在广为人知的知识是,while循环通常更易于维护,因为对不变量进行推理比较容易,并且它们通常可以更好地处理棘手的空情况。

在您的特定情况下,循环等于

for(; doSomething(), !condition(); doSomethingElse()){}

所以我只会用 break版本中包含一个doSomethingdoSomethingElse多个语句版本,而我不想像您那样将它们放入单独的函数中。

就是说,如果您的循环更复杂,则需要(开始,检查,递增)迭代,那么您应该考虑将其重构为更简单的东西。


1

我想我们是否要为此弥补一个术语,也许是:

可逃避循环


-1。问题不是组成一个名字,而是一个通用名称是否已经存在。另外,所有循环都是“可转义的”,因此它并不是一个特别有效的名称。
布莱恩·奥克利

@BryanOakley根据定义,无限循环不应该是易碎的。除了糟糕的编程之外,可能不应该为此使用术语。
LarsTech 2011年


0

在每种情况下都还不错。我发现自己使用某些类型的API编写了这种循环。举例来说,假设您有一个循环对象,并且需要检查其中相当深的条件,例如:

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

现在,假设每个getXXX方法都可能返回null。这样,仍然可以编写布尔表达式,尽管这是一个非常复杂且难以理解的表达式。然后,我们必须做几乎相同的重做才能获得当前的处理程序对象。在这种情况下,我发现编写while (true)带有break和continue 的循环会更容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.