Как выйти (перейти к следующему элементу родительского цикла) цикл for внутри цикла for - PullRequest
2 голосов
/ 18 июня 2011
for (int i = 0; i<10; i++)
{ 
  //do some validation for record length

  //if it is not valid

  continue; // goes to the next iteration in for loop for 'i'

  for (int j = 0; j<5; j+=2)    
  {

     //do some more validation for individual record

     //if it is not valid

Здесь следует перейти к следующему i, если я использую continue.Здесь он перейдет к следующему j Может кто-нибудь, пожалуйста, дайте мне знать, как это сделать?

Ответы [ 7 ]

2 голосов
/ 18 июня 2011

Вам нужно специально проверить флаг во внешнем цикле, если после внутреннего цикла что-то есть:

for(some_outer_vars){
  bool should_skip = false;
  // ...
  for(some_inner_vars){
    // ...
    if(your_condition){
      should_skip = true;
      break;
    }
  }
  if(should_skip)
    continue;
  // ...
}
2 голосов
/ 18 июня 2011

Использование break; внутри цикла j приведет к полному выходу из цикла j.

Но, по крайней мере, потратьте пару минут, чтобы решить, может ли альтернативный алгоритм, подход или условие завершения устранить необходимость прерывания в середине цикла.

1 голос
/ 18 июня 2011

У вас есть что-нибудь после внутреннего цикла?Если нет, вы можете просто использовать break:

for (i = 0; i < 10; i++)
{
  if (i is no good)
    continue;

  for (j = 0; j < 5; j++)
  {
     if (j is no good)
       break;
  }
}

Если вам нужно что-то сделать позже, вы можете использовать break в сочетании с другим флагом.

0 голосов
/ 18 июня 2011

Я стараюсь избегать прерывания и продолжения при работе с циклами, потому что их легко пропустить, и их значения меняются, если вам придется реструктурировать код позже.Вы можете использовать J = 5;когда вам нужно выйти из внутреннего цикла.Если вы добавите третий цикл или переключатель, значение этой строки не изменится.Иногда вам нужно будет добавить операторы внутри ваших циклов, проверяющих i и j, или даже новую переменную, такую ​​как bool iIsInvalid, но я думаю, что это облегчает чтение потока управления.

0 голосов
/ 18 июня 2011

Если вы не можете расположить логику так, чтобы break во внутреннем цикле сразу переходил к продолжению внешнего цикла, сделайте следующее:

for (int i = 0; i<10; i++)
{ 
    if (!valid(i)) continue;
    for (int j = 0; j<5; j+=2)    
    {
        if (!valid(i,j)) goto continue_i;
        do_whatever_with_i_and_j()
    }
    more_stuff_here();
continue_i:
}

Там, я это сказал. Код короче, проще, легче для чтения и анализа, чем версия, которая устанавливает флаг, затем ломается, затем немедленно проверяет флаг снова и условно продолжается.

Другой вариант это

void inner_loop(int i) {
    if (!valid(i)) return;
    for (int j = 0; j<5; j+=2)    
    {
        if (!valid(i,j)) return;
        do_whatever_with_i_and_j()
    }
    more_stuff_here();
}

for (int i = 0; i<10; i++)
{
    inner_loop(i);
}

Однако, в зависимости от того, что делает внутренний цикл, вы можете обнаружить, что создаете вполне механизм, который дает ему доступ ко всему, что он должен модифицировать.

Сообщество вики, потому что об этом (или подобных ситуациях) столько раз спорили на SO, что практически определяли «субъективное и аргументированное».

0 голосов
/ 18 июня 2011

для (int i = o; i <10; i ++) {</p>

}

для (int j = 0; j <5; j + = 2) { перерыв; } </p>

"перерыв"; завершит ваш текущий цикл j и перейдет к следующему я.

0 голосов
/ 18 июня 2011

Вместо break;.Это должно вывести вас из внутреннего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...