Что такое правильный способ для преобразования для цикла в время цикла?

голоса
1

У меня есть цикл вида:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}

И я хочу , чтобы преобразовать его в петлю в то время ( в основном потому , что я хочу играть со значением iвнутри петли , чтобы идти вперед и назад , и мой коллега думает , что делает это в цикле склонна к проблемам. Я , как правило, согласен с ним). Так что я написал что - то вроде этого:

int i = from;
while (i < to) {
  try {
    // do some code (I don't know exactly what, it is subject to change)
  } finally {
    i++;
  }
}

Что побудило некоторые несколько громких комментариев. Мои рассуждения в том , что вы не знаете , что делает код внутри цикла - это может (и делает) несколько continueкоманд.

В ответ он написал:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}

Конечно его меньше строк, но я до сих пор думаю, что мой код более элегантно - что вы думаете?

Задан 03/11/2009 в 18:26
источник пользователем
На других языках...                            


6 ответов

голоса
3

И я хочу, чтобы преобразовать его в петлю в то время (в основном потому, что я хочу играть со значением I внутри цикла, чтобы идти вперед и назад, и мой коллега думает, что делает это в цикле склонна к проблемам. Я, как правило согласиться с ним).

Это вполне приемлемо для большинства языков. Там нет причин, чтобы избежать для цикла.

Ответил 03/11/2009 в 18:30
источник пользователем

голоса
5

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

Это не будет иметь значения, если это цикл или время цикла, то точка будет индексатор в конечном итоге приведет вас принять решение о завершении цикла?

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

Ответил 03/11/2009 в 18:31
источник пользователем

голоса
0

Самый простой способ сделать это было бы не превратить в петлю в то время как, например, как показано ниже.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Ответил 03/11/2009 в 18:33
источник пользователем

голоса
2

Мне кажется , что это может быть проще и более удобным для чтения , чтобы преобразовать его в:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}

и, таким образом отделить завершение цикла от переменного приращения.

Если я вижу петлю с предельной проверки (например i < limit) , я бы склонны считать , что есть переменная , которая модифицируется в (разумно) последовательным образом. Там нет причин , почему вы не можете делать то , что вы хотите, но я склоняюсь к более читаемым и более ожидаемое поведение.

Ответил 03/11/2009 в 18:34
источник пользователем

голоса
0

Для того, чтобы ответить на вопрос о том, какой код я выбрал бы; Я выбираю свой длинный код. Его гораздо легче читать первый (более длинный) цикл. И да, я могу читать второй, но даже если у вас есть большой опыт, вы должны смотреть дважды, чтобы знать, что делает что петля. Кроме того, компилятор будет оптимизировать код достаточно хорошо.

Ответил 03/11/2009 в 18:35
источник пользователем

голоса
1

Зачем беспокоиться о глупых петлями , когда вы можете сделать то же самое (и многое другое!) С убер-мощным goto?

i = fro;
my_loop:
//all your stuff here
i++;
if (i < to) goto my_loop;

Если вы один из тех слабонервных программистов , которые уменьшают goto, то вы можете попробовать это:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Ответил 03/11/2009 в 18:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more