有没有一种语言可以突破多个循环?

问题描述 投票:0回答:6

break
在大多数语言中都会中断 for 循环,但在嵌套循环的情况下,我从未遇到过第 n 顺序中断。
1. 任何语言都有这样的东西吗?
2. 如果是的话,正确的名称是什么?
3. 如果不是,为什么?
注意。我不是在寻找解决方法。

关于第 3 点。我知道的最接近的是

goto
,不应该使用它,因为它会导致意大利面条代码(Python 仅在笑话模块中具有它),但这似乎是一个不同的问题,因为要标记布尔变量内部中断、捕获引发的自定义错误或将块移动到函数以通过 return 中断要复杂得多(就代码中的行号和变量而言)。

(从理论角度来看,这是一个好奇问题,但如果有帮助的话,我主要用Python、Matlab和JS编写代码。我了解Perl、Pascal和Basic,但我只知道C++的基础知识,而且知道得可耻很少的机器代码。)

for-loop break goto
6个回答
6
投票

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
            }
        }
    }

1
投票

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)


1
投票

我不知道有什么语言可以让你做到这一点(除了 @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;
}

0
投票

在 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...

0
投票

还有几个例子没有提到。

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;

-1
投票

不,没有(据我所知)。为什么?因为如果您需要一次退出多个嵌套的 for 循环,那么您将遇到代码设计问题,而不是语法问题。上面给出的所有答案,除了 @PinkTurtle 之外,都使用某种 goto 语句,这是不推荐的。

© www.soinside.com 2019 - 2024. All rights reserved.