2016-04-27 11 views
1

Wie man Beispielcode ohne goto und ohne zusätzlichen Prozeduraufruf schreibt?C multi-loop for() Grundlagen

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

Verwendung 'break' statt' goto'? – user463035818

+1

State Machine Design? Implementiere Zustände auf jeder Schleife und überprüfe, ob man fortfahren (s) und/oder brechen (s) –

+0

alle Bedingungen in den verschachtelten Schleifen falsch machen kann (entsprechend der Zahl, aus der du ausbrechen willst), dann brich von der inneren die meiste Schleife. Sie haben keinen Code nach der Überprüfung hier, aber darauf hingewiesen, dass jeder Code danach in "Eltern" Schleifen würde noch einmal vor dem Brechen ausgeführt werden. – yano

Antwort

2

Überprüfung dieser Code:

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

ja, einfach flagge, thx – theWalker

+0

ihr willkommen, viel glück. – aghilpro

2

goto nj mit break ersetzt werden. break kann Ihnen jedoch nicht helfen, wenn Sie aus verschachtelten Schleifen ausbrechen müssen. Ich denke, das ist ein vollkommen legitimer Anwendungsfall für goto. Die einzige Alternative, an die ich denken kann, besteht darin, den Schleifenzähler außerhalb seines Bereichs, z. c = cmax(j). Schlimmer als goto, meiner Meinung nach.

+0

Ich stimme nicht wirklich zu, dass "Break kann nicht helfen". Er könnte eine Fahne benutzen, um die Unterbrechung an die äußeren Schleifen weiterzuleiten. Ob das besser wäre als "goto", ist eine andere Frage. – user463035818

+0

Ich bin nicht ganz einverstanden in Bezug auf "Pause kann nicht helfen" oder "Pause kann helfen". Vielleicht ist es auch eine Frage der Formulierung und des Pragmatismus. Ich wage zu sagen, ich habe Beispiele für gute Programmierpraxis mit 'goto' zum Ausbrechen mehrerer verschachtelter Schleifen gesehen und es ist vielleicht eines von zwei Szenarien, in denen ich auch ein' goto' verwende. Obwohl ich verstehe, antwortet das nicht Die Frage, wann man das Ziel erreichen kann, ohne den Code durch Deklarieren, Einstellen, Überprüfen und Zurücksetzen zusätzlicher Variablen, Flags usw. zu überfordern, ist die beste Lösung. – user3078414