break
ステートメントを使用する場合、内側のループのみが中断され、外側のループを中断するにはフラグを使用する必要があります。ただし、ネストされたループが多数ある場合、コードは適切に表示されません。
すべてのループを解除する他の方法はありますか? (goto stmt
を使用しないでください。)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
どうですか:
if(condition) {
i = j = 1000;break;
}
いいえ、break
で楽しさを損なわないでください。これは、goto
の最後の有効な使用です;)
そうでない場合は、フラグを使用して、深くネストされたループから抜け出すことができます。
ネストされたループから抜け出す別の方法は、両方のループを別の関数に分解し、終了したいときにその関数から戻ることです。
要約-ネストされたループから抜け出すには:
goto
を使用しますここにxkcdを含めることに抵抗できませんでした:)
後藤は有害とみなされます しかし、コメントの多くの人々がそうする必要はないと示唆しているように。慎重に使用すれば、すばらしいツールになります。節度に使用されるものはすべて楽しいです。
bool stop = false;
for (int i = 0; (i < 1000) && !stop; i++)
{
for (int j = 0; (j < 1000) && !stop; j++)
{
if (condition)
stop = true;
}
}
1つの方法は、すべてのネストされたループを関数に入れ、すべてのループから抜け出す必要がある場合に最も内側のループから戻ることです。
function()
{
for(int i=0; i<1000; i++)
{
for(int j=0; j<1000;j++)
{
if (condition)
return;
}
}
}
goto
が問題を解決すると思います
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
goto end;
}
}
}
end:
stmt2
可読性が必要な場合は、ブール変数が必要です。
bool broke = false;
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
broke = true;
break;
}
}
if (broke)
break;
}
読みにくくしたい場合は、ブール評価に参加できます。
bool broke = false;
for(int i = 0; i < 1000 && !broke; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
broke = true;
break;
}
}
}
最終的な方法として、初期ループを無効にすることができます:
for(int i = 0; i < size; i++) {
for(int j = 0; j < 1000; i++) {
if (condition) {
i = size;
break;
}
}
}
LLVMチームからのこの賢明なアドバイスを使用してください。
「述語ループを述語関数に変換する」
見る:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
Iとjの値が必要な場合、これは動作しますが、他のパフォーマンスよりもパフォーマンスが低下します。
for(i;i< 1000; i++){
for(j; j< 1000; j++){
if(condition)
break;
}
if(condition) //the same condition
break;
}
注意:この回答は、本当にあいまいな構造を示しています。
GCCを使用している場合は、 このライブラリ を確認してください。 PHPと同様に、break
は、終了するネストされたループの数を受け入れることができます。このようなものを書くことができます:
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// break two nested enclosing loops
break(2);
}
}
}
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; i++) {
if(condition) {
goto end;
}
}
end: