2016-04-27 9 views
1

gotoと追加の手続き呼び出しなしでサンプルコードを書くには?Cマルチループfor()の基礎

for(i=0;i<imax;i++) 
{ for(j=0;j<jmax(i);j++) 
    { for(c=0;c<cmax(j);c++) 
     { if(!check1(c)) 
      { if(check2()) goto ni; 
       else goto nj; 
      } 
     } 
    // **EDIT** procedure call is here 
nj:; 
    } 
ni:; 
} 
+3

使用' break'? – user463035818

+1

ステートマシン設計?すべてのループで状態を実装し、continue(s)またはbreak(s)を使用するかどうかをチェックします。 –

+0

ネストされたループ内のすべての条件をfalseにします。ほとんどのループ。ここでチェックした後にコードはありませんが、後に "親"ループでコードを破棄する前にもう一度実行するように指示してください。 – yano

答えて

2

チェックこのコード:代わりに `goto`の

bool flag = false; 
    for(i=0;i<imax;i++) 
    { for(j=0;j<jmax(i);j++) 
     { for(c=0;c<cmax(j);c++) 
      { if(!check1(c)) 
       { if(check2()) {flag=true;break;}// goes to ni 
        else break; //goes to nj 
       } 
      } 
      if(flag){flag=false; break;} 
      nj:; 
     } 
     // procedure 
    ni:; 
    } 
+0

はい、単にフラグ、thx – theWalker

+0

あなたの歓迎、幸運。 – aghilpro

2

goto njbreakと交換することができます。しかし、ネストされたループから脱出する必要がある場合、breakはあなたを助けません。私はこれがgotoの完全に正当なユースケースだと思います。私が考えることのできる唯一の選択肢は、その範囲外のループカウンタを設定することです。 c = cmax(j)。私の意見では、gotoより悪い。

+0

「ブレーク・カンツ・ヘルプ」には本当に同意しません。彼は、外側のループにブレークを送るためのフラグを使用することができました。これが「goto」よりも優れているかどうかは、別の質問です。 – user463035818

+0

私は「壊れることはできません」、あるいは「壊れることは助けてください」という点に関しては全く同意できません。多分それは言葉遣いと実用主義の問題でもあります。私は、複数のネストされたループを中断するために 'goto'を使って良いプログラミング実践の例を見てきたと言いますが、おそらく2つのシナリオの1つで、Cでも' goto'を使っています。追加の変数、フラグなどを宣言し、設定し、チェックし、リセットすることによって、コードを誇張せずに目標を達成できるときにいつでも 'break 'を使うことが最良の解決策です。 – user3078414