web-dev-qa-db-ja.com

breakを使用して複数のforループのネストを終了することはできますか?

break関数を使用して、いくつかのネストされたforループを終了することは可能ですか?もしそうなら、どのようにしてこれをやりますか?また、ブレークが何個のループから出るかを制御できますか?

269
Faken

私の知る限りでは、C++はJavaや他の言語のように命名ループをサポートしていません。ジャンプを使用するか、使用するフラグ値を作成することができます。各ループの終わりにフラグの値を確認してください。 trueに設定されている場合は、その反復から抜け出すことができます。

212
Cullen Walsh

いいえ、breakでそれを台無しにしないでください。これがgotoを使うための最後の要塞です。

249
Henk Holterman

入れ子になったループから抜け出すためのもう1つの方法は、両方のループを別々の関数に分割し、終了するときにその関数からreturnを呼び出すことです。

もちろん、これは最後から以外の場所で関数から明示的にreturnを使うべきかどうかというもう一つの議論を引き起こします。

52
Greg Hewgill

ラムダを使用して明確な答えを追加するだけです。

  for (int i = 0; i < n1; ++i) {
    [&] {
      for (int j = 0; j < n2; ++j) {
        for (int k = 0; k < n3; ++k) {
          return; // yay we're breaking out of 2 loops here
        }
      }
    }();
  }

もちろん、このパターンには一定の制限があり、明らかにC++ 11のみですが、非常に便利だと思います。

47
Predelnik

breakはそれを含む最も内側のループだけを終了します。

gotoを使用すると、任意の数のループから抜け出すことができます。

もちろん、gotoはよく--- 有害だと考えられます です。

break関数[...]を使うのは適切ですか?

Breakとgotoを使用すると、プログラムの正当性について推論するのが難しくなります。これについての議論はここを見てください: ダイクストラは正気ではなかった

32
Karl Voigtland

このanswearはすでに発表されていますが、私は良いアプローチは次のようにすることだと思います:

for(unsigned int z = 0; z < z_max; z++)
{
    bool gotoMainLoop = false;
    for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
    {
        for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
        {
                          //do your stuff
                          if(condition)
                            gotoMainLoop = true;
        }
    }

}
19
inf.ig.sh

これはどう?

for(unsigned int i=0; i < 50; i++)
{
    for(unsigned int j=0; j < 50; j++)
    {
        for(unsigned int k=0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                j=50;
                k=50;
            }
        }
    }
}
14
jebeaudet

gotoとラベルを使用してネストしたループから抜け出すコード例:

for (;;)
  for (;;)
    goto theEnd;
theEnd:
12
Helio Santos

いくつかのネストしたループから抜け出すための良い方法の1つは、コードを関数にリファクタリングすることです。

void foo()
{
    for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < 50; j++)
        {
            for(unsigned int k=0; k < 50; k++)
            {
                // If condition is true
                return;
            }
        }
    }
}
9
Deqing

gotoはネストしたループを壊すのに非常に役立ちます。

for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
             for (l = 0; l < 1000; l++){
                ....
                if (condition)
                    goto break_me_here;
                ....
            }
        }
    }
}

break_me_here:
// Statements to be executed after code breaks at if condition
5

breakステートメントは、それが含まれている中で最も近いdoforswitch、またはwhileステートメントの実行を終了します。制御は終了したステートメントの次のステートメントに渡されます。

msdn から。

2
Rob

私はgotoがこの状況で有効であると思います:

break/continueをシミュレートするには、次のようにします。

ブレーク

for ( ;  ;  ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            goto theEnd;
        }
    }
}
theEnd:

持続する

for ( ;  ; ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            i++;
            goto multiCont;
        }
    }
    multiCont:
}
2
JadeMaveric

PHPなどの他の言語では、ブレークアウトするネストループレベルの量を指定するためにbreakのパラメータ(つまりbreak 2;)を使用できますが、C++では使用できません。ループの前にfalseに設定したブール値を使用し、ブレイクする場合はループ内でtrueに設定し、ネストしたループの後にブール値がtrueに設定されているかどうかをチェックする条件ブレイクを使用して解決する必要があります。そしてもしそうなら壊れなさい。

0

私はこれが古い記事であることを知っています。しかし、私は少し論理的で簡単な答えを提案します。

for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < conditionj; j++)
        {
            for(unsigned int k=0; k< conditionk ; k++)
            {
                // If condition is true

                j= conditionj;
               break;
            }
        }
    }
0
Aditya Jagtap

1つのbool変数で任意の数のループを解除します。以下を参照してください。

bool check = true;

for (unsigned int i = 0; i < 50; i++)
{
    for (unsigned int j = 0; j < 50; j++)
    {
        for (unsigned int k = 0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                check = false;
                break;
            }
        }
        if (!check)
        {
            break;
        }
    }
    if (!check)
    {
        break;
    }
}

このコードでは、break;すべてのループ。

0
vikas bansal