break
在大多数语言中都会中断 for 循环,但在嵌套循环的情况下,我从未遇到过第 n 顺序中断。关于第 3 点。我知道的最接近的是
goto
,不应该使用它,因为它会导致意大利面条代码(Python 仅在笑话模块中具有它),但这似乎是一个不同的问题,因为要标记布尔变量内部中断、捕获引发的自定义错误或将块移动到函数以通过 return 中断要复杂得多(就代码中的行号和变量而言)。
(从理论角度来看,这是一个好奇问题,但如果有帮助的话,我主要用Python、Matlab和JS编写代码。我了解Perl、Pascal和Basic,但我只知道C++的基础知识,而且知道得可耻很少的机器代码。)
Java 有一个标记为break的语句,可以让你跳出任意数量的循环:
search:
for (i = 0; i < arrayOfInts.length; i++) {
for (j = 0; j < arrayOfInts[i].length;
j++) {
if (arrayOfInts[i][j] == searchfor) {
foundIt = true;
break search; // <<=== This statement breaks both nested loops
}
}
}
PHP 允许“多级中断”(例如,
break 3
,它使您脱离三级循环),这些内容将在此处讨论:
https://www.php.net/manual/en/control-structs.break.php
Bash 也有这个功能:
https://tldp.org/LDP/abs/html/loopcontrol.html
(术语“多级中断”出现在 2008 年《程序构建数学》的一篇文章中,但我不认为这是该术语的第一次出现:https://dl.acm.org/doi/abs /10.1007/978-3-540-70594-9_11)
我不知道有什么语言可以让你做到这一点(除了 @dasblinkenlight 示例 - 并不是说没有),但你可以轻松地用任何具有
break
语句的语言来模拟它。
即有条件地中断布尔退出循环变量。
var exitLoops = false;
for (var i = 0; i < x; i++) {
for (var j = 0; j < y; j++) {
for (var k = 0; k < z; k++) {
if (something) {
exitLoops = true;
break;
}
}
if (exitLoops) break;
}
if (exitLoops) break;
}
在 JavaScript 中你可以做到这一点
复制粘贴以下 Chrome 开发控制台,
free:
for(var i=0; i<10; i++) {
for(var j=0; j<10; j++) {
for(var k=0;k<10;k++){
console.log('I am at i='+i+' , j='+j+ ' , k='+k);
if(k==3) {
console.log('I will now break FREE...');
break free;
}
}
}
}
console.log('... And Now I am Here...')
输出
I am at i=0 , j=0 , k=0
I am at i=0 , j=0 , k=1
I am at i=0 , j=0 , k=2
I am at i=0 , j=0 , k=3
I will now break FREE...
... And Now I am Here...
还有几个例子没有提到。
Perl 有一个标记为
break
——尽管 Perl 将其拼写为 last
。 目标是循环顶部的标签名称。 例如:
#!/usr/bin/perl
use strict;
use warnings;
OUTER:
foreach my $i (1..3) {
foreach my $j (1..3) {
print "(i=$i j=$j) ";
if ($i == 2 and $j == 2) {
last OUTER;
}
}
print("\n");
}
print "\n";
Ada 有类似的构造,但目标是循环的名称,这与可以作为
goto
语句的目标的标签不同(Ada 将 break
拼写为 exit
):
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Exit_Outer is
begin
Outer:
for I in 1 .. 3 loop
for J in 1 .. 3 loop
Put("(I="); Put(I, Width => 0);
Put(" J="); Put(J, Width => 0);
Put(") ");
if I = 2 and J = 2 then
exit Outer;
end if;
end loop;
New_Line;
end loop Outer;
end Exit_Outer;
不,没有(据我所知)。为什么?因为如果您需要一次退出多个嵌套的 for 循环,那么您将遇到代码设计问题,而不是语法问题。上面给出的所有答案,除了 @PinkTurtle 之外,都使用某种 goto 语句,这是不推荐的。