質問
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 = 1
に i = 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
.
嫌いな人も少なくない 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