2012-05-14 5 views
8

einfache Frage in Bezug auf C++ Code:Pause; C++: die Schleife ist es bricht tatsächlich

for(int i=0;i<npts;i++) 
{ 
    for(int j=i;j<2*ndim;j++) 
    { 
     if(funcEvals[i]<bestListEval[j]) 
     { 
      bestListEval[j] = funcEvals[i]; 
      for(int k=0;k<m_ndim;k++) 
       bestList[j][k] = simplex[i][k]; 
      break; 
     } 
    } 
} 

Ich möchte sicherstellen, dass

  • Jede Zeile double **simplex wird höchstens einmal
  • Die Instanz in double **bestList eingefügt von break bricht hier die zweite (innere) for Schleife aus.

Ist das der Fall?

+0

Ja, es ist aus der zweiten 'for' Schleife zu brechen. –

+1

Die 'break'-Anweisung wird IMMER passieren, wenn 'funcEvals [i]

+3

'break' bricht immer aus der innersten Struktur (loop oder' switch') heraus, die an diesem Punkt im Code aktiv ist (in diesem Fall das 'for (j ...' loop). –

Antwort

28

Die break-Anweisung in C++ wird aus der for- oder switch-Anweisung herausbrechen, in der die Pause direkt platziert wird. Es bricht die innerste Struktur (Schleife oder Schalter). In diesem Fall:

for(int i=0;i<npts;i++) 
    { 
     for(int j=i;j<2*ndim;j++) 
     { 
      if(funcEvals[i]<bestListEval[j]) 
      { 
       bestListEval[j] = funcEvals[i]; 
       for(int k=0;k<m_ndim;k++) 
        bestList[j][k] = simplex[i][k]; 
       break; 
      } 
     } 
     // after the 'break' you will end up here 
    } 

In C++ gibt es keine Möglichkeit, eine andere Schleife zu unterbrechen. Um aus den Elternschleifen auszubrechen, müssen Sie einen anderen unabhängigen Mechanismus verwenden, wie zum Beispiel die Endbedingung auszulösen.

Wenn Sie mehr als eine innere Schleife beenden möchten, können Sie diese Schleifen in eine Funktion extrahieren. In C++ können 11 Lambdas verwendet werden, um es an Ort und Stelle zu tun - so wird es nicht notwendig sein, zu verwenden.

+1

Ein Label und 'Goto' können oft verwendet werden, um aus anderen Loops auszubrechen. –

+5

Im Allgemeinen finde ich es am praktischsten, diese Art von Ding in eine Funktion namens 'findFirstElemThatXYZ' zu setzen und dann zurückzukehren, wenn ich es finde. – Dennis

4

Die break Anweisung in C++ wird die for oder switch Anweisung bricht aus, in dem die break direkt platziert. In diesem Fall wird es aus der Schleife for (int j = ... ausbrechen.

Es gibt keine Möglichkeit in C++, break auf irgendeine andere Schleife zu richten. Um aus den Elternschleifen auszubrechen, müssen Sie einen anderen unabhängigen Mechanismus verwenden, wie zum Beispiel die Endbedingung auszulösen.

+0

Vergessen Sie nicht, goto, Ausnahmen und longjmp :) – sehe

+0

Einstellung 'i = npts', um die Schleife zu brechen, ist verwirrend, verwenden Sie stattdessen einen booleschen. –

+1

@MooingDuck Mein Beispiel ist so konzipiert, dass es minimal invasiv für die OP-Stichprobe ist. – JaredPar

3

Sie brechen aus Ihrer zweiten Schleife zu Ihrer ersten Schleife aus.

for (int i=0; i<npts; i++) 

Sie könnten einen boolean an der Spitze gesetzt

bool shouldBreak = false; 

und wenn Sie Pause schreiben, schreiben

shouldBreak = true; 
break; 

Dann am Ende der Schleife, überprüfen jedes Mal,

if (shouldBreak) break; 
-1
for (int i = 0; i < npts; i++) 

Sie könnten einen boolean an der Spitze

bool shouldBreak = false; 

gesetzt und wenn Sie die andere Schleife brechen wollen, schreiben

shouldBreak = true; 
break;