2012-05-14 3 views
8

простой вопрос о C++ код:break; C++: какой цикл он на самом деле нарушение

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; 
     } 
    } 
} 

Я хочу, чтобы гарантировать, что

  • Каждая строка double **simplex вставляется в самый раз в double **bestList
  • Экземпляр break здесь вырывается из второго (внутреннего) цикла for.

В этом случае?

+0

Да, вспыхивают второго 'for' цикла. –

+1

Оператор 'break' ВСЕГДА произойдет, если' funcEvals [i]

+3

'break' всегда вырывается из самой внутренней структуры (цикла или' switch'), активной в этой точке кода (в этом случае цикл 'for (j ...'). –

ответ

28

Оператор break в C++ выйдет из инструкции for или switch, в которой перерыв размещен непосредственно. Он разрушает самую внутреннюю структуру (петлю или переключатель). В этом случае:

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 
    } 

В C++ нет возможности разбить цель на любой другой цикл. Чтобы вырваться из родительских циклов, вам нужно использовать какой-то другой независимый механизм, например, запускать конечное условие.

Кроме того, если вы хотите выйти из более чем одного внутреннего цикла, вы можете извлечь эти петли в функцию. В C++ 11 lambdas можно использовать, чтобы сделать это на месте - так что не будет необходимости использовать goto.

+1

Метка и 'goto' часто могут использоваться для выхода из других циклов. –

+5

Обычно я считаю, что наиболее удобно помещать такие вещи в функцию, называемую «findFirstElemThatXYZ», а затем возвращаться, когда я ее нахожу. – Dennis

4

break заявление в C++ сломается из for или switch заявление, в котором break непосредственно размещен. В этом случае он вырвется из цикла for (int j = ....

В C++ нет способа иметь break для любого другого цикла. Чтобы вырваться из родительских циклов, вам нужно использовать какой-то другой независимый механизм, например, запускать конечное условие.

// Causes the next iteration of the 'for (int i ...' loop to end the loop) 
i = npts; 

// Ends the 'for (int j ...' loop 
break; 
+0

Не забывайте о goto, исключениях и longjmp :) – sehe

+0

Установка 'i = npts', чтобы разбить цикл, запутанна, вместо этого используйте логическое значение. –

+1

@MooingDuck мой пример разработан, чтобы быть минимально инвазивным к образцу OP. – JaredPar

3

Вы выходите из своей второй петли в свой первый цикл.

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

Вы можете установить логическое значение в верхнем

bool shouldBreak = false; 

и когда вы пишете перерыв, писать

shouldBreak = true; 
break; 

Затем в конце вашего цикла, проверьте каждый раз,

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

Вы можете установить логическое значение в верхнем

bool shouldBreak = false; 

и когда вы хотите разорвать другую петлю, написать

shouldBreak = true; 
break; 
Смежные вопросы