質問

C# (他の言語については自由に答えてください) ループで、ループの構造を離れて次の反復に進む手段としての Break と continue の違いは何ですか?

例:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
役に立ちましたか?

解決

break ループから完全に抜け出します。 continue ただ スキップ 現在の反復。

例えば:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

ブレークにより、最初の反復でループが終了します。 DoSomeThingWith 決して実行されることはありません。これはここです:

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

実行されません DoSomeThingWith のために i = 0, 、しかしループは 続く そして DoSomeThingWith のために処刑されます i = 1i = 9.

他のヒント

これを理解する非常に簡単な方法は、各キーワードの後に​​「ループ」という単語を置くことです。これらの用語は、日常のフレーズのように読むだけで意味が理解できるようになりました。

break ループ - ループが壊れて停止します。

continue ループ - ループは次の反復で実行を続けます。

壊す プログラムカウンターが最も内側のループの範囲外に飛び出します。

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

このように機能します

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

続く ループの最後にジャンプします。for ループでは、Continue はインクリメント式にジャンプします。

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

このように機能します

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

break を止めるだろう foreach 完全にループして、 continue 次へスキップします DataRow.

以前は休憩を使用すべきか続行すべきかいつも迷っていました。これは私が思い出すのに役立つものです:

中断と続行をいつ使用するか?

  1. 壊す - 別れたようなものです。悲しいですね、皆さんお別れですね。

Break

  1. 続く - 今日は休んで、明日すべてを解決するつもりであることを意味します(つまり、現在の反復をスキップします)!

Continue

嫌いな人も少なくない break そして continue. 。私が見た彼らに関する最近の苦情は、 JavaScript:良い部分 ダグラス・クロックフォード著。しかし、特に言語に do-while または do-until ループのスタイル。

私がよく使うのは break リストから何かを検索するループ内。見つかってしまったら続ける意味がないので辞めた方が良いでしょう。

私が使う continue リストのほとんどの要素を使用して何かを実行しているが、いくつかの要素をスキップしたい場合。

break このステートメントは、誰かまたは何かからの有効な応答をポーリングするときにも役立ちます。の代わりに:

Ask a question
While the answer is invalid:
    Ask the question

一部の重複を削除して、次のように使用できます。

While True:
    Ask a question
    If the answer is valid:
        break

do-until 前に述べたループは、その特定の問題に対するより洗練された解決策です。

Do:
    Ask a question
    Until the answer is valid

重複はありません。 break どちらかが必要です。

皆さんとても分かりやすい説明をしていただきました。それが役立つ場合に例を示すために、私はまだ回答を投稿しています。

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

出力は次のとおりです。

0[印刷済み] 1[印刷済み] 2[印刷済み]

したがって、i == 3 の場合はブレークがあるため、3[Printed] & 4[Printed] は表示されません。

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

出力は次のとおりです。

0[印刷済み] 1[印刷済み] 2[印刷済み] 4[印刷済み]

したがって、i == 3 の場合は continue があるため、3[Printed] は表示されません。

壊す

Break はループを直ちに終了させます。

続く

これは休憩の逆のことをします。ループを終了する代わりに、コードの残りの部分をスキップして、すぐに再度ループします。

例として

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

1、2、3 を (別の行に) 印刷します。

i = 2 にブレーク条件を追加します。

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

ここで、ループは 1 を出力して停止します。

休憩を継続に置き換えます。

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

次に、1 と 3 をループ出力します (2 をスキップします)。

したがって、 break ループを停止しますが、 continue 次の反復にスキップします。

残念ながら、Ruby は少し異なります。追伸:ちょっと記憶が曖昧なので間違っていたらごめんなさい

Break/Continue の代わりに、break/next があり、ループに関しては同じように動作します。

ループは (他のものと同様に) 式であり、最後に実行した内容を「返します」。ほとんどの場合、ループから戻り値を取得することは無意味なので、誰もがこれを行うだけです

a = 5
while a < 10
    a + 1
end

ただし、これを行うことはできます

a = 5
b = while a < 10
    a + 1
end # b is now 10

ただし、多くの Ruby コードはブロックを使用してループを「エミュレート」します。正規の例は次のとおりです

10.times do |x|
    puts x
end

ブロックの結果を使って何かをしたいと思うことの方がはるかに一般的であるため、ここが厄介なところです。Break/Next は、ブロックのコンテキストでは異なる意味を持ちます。

Break はブロックを呼び出したコードから飛び出す

next はブロック内の残りのコードをスキップし、指定した内容をブロックの呼び出し元に「返します」。これは例がないと意味がありません。

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

そうそう。Ruby は素晴らしいですが、いくつかのひどい例外もあります。これは私が何年も使ってきた中で 2 番目にひどいものです :-)

簡単な答え:

壊す ループをすぐに終了します。
続く 次の項目の処理を開始します。(存在する場合は、for/while の評価行にジャンプします)

明らかなことを言わせてください。Break も continue も追加しないとプログラムが再開されることに注意してください。つまり特定のエラーをトラップし、ログに記録した後、処理を再開したいと思いましたが、次の行の間にさらにコード タスクがあったため、そのまま放置しました。

foreach ループから完全に抜け出すには、 壊す 使用されている;

ループ内の次の反復に進むには、 続く 使用されている;

壊す これは、オブジェクトのコレクション (データテーブル内の行など) をループしていて、特定の一致を検索している場合に便利です。一致が見つかったら、残りの行を続行する必要がないため、ブレイクアウトしたい場合に便利です。 。

続く ループ反復内で必要なことを完了した場合に便利です。通常は 続くもし.

使いたくない場合は 壊す 反復条件が false になるように I の値を増やすだけで、次の反復でループが実行されなくなります。

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

他の言語については、次のようになります。

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top