Nabil Droussi Ответов: 4

Петля с разрывом или без него


Привет эксперты,

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


Приведенный ниже код иллюстрирует то, что я имею в виду.

Как вы думаете, что лучше всего использовать и почему:
1.
for(int i=0; i<10; i++)
{
  WriteLine("saisir une valeur");
  int valeur = Convert.ToInt32(ReadLine());
  if(valeur == 50){
       WriteLine("Bingo! FOUND!");
       break;
  }
}

2.
bool found = false;
int tentatives = 0;
while(!found && ++tentatives <= 10)
{
   WriteLine("saisir une valeur");
  int valeur = Convert.ToInt32(ReadLine());
  if(valeur == 50){
       WriteLine("Bingo! FOUND!");
       found = true;
  }
}


Что я уже пробовал:

Я попробовал первый вариант, учитель 10 лет назад попросил этого не делать. То же самое произошло с моим другом, который готовит свою степень в области электротехники.

Richard MacCutchan

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

W∴ Balboos, GHB

Разве это не абсолютно ясно и в примере 1? То есть valeur==50 ?

Richard MacCutchan

Именно в этом примере, но в более длинном и сложном цикле это может быть не так. Лично я обычно выбираю вариант 1.

W∴ Balboos, GHB

Моя голова работает в другую сторону для увеличения сложности - должно быть, это какая-то французская штука.

Richard MacCutchan

У меня нет никаких реальных предпочтений в любом случае, я просто склонен писать то, что кажется мне разумным в то время. А затем потратьте следующие несколько часов, пытаясь отладить его.

4 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Я бы предпочел внутренний разрыв - он абсолютно понятен и облегчает отслеживание, если у вас есть, например, несколько обработчиков для желаемого значения и разрыва;

С другой стороны, тест while() может расти и расти, становясь все более трудным для понимания и более легким для кодирования с ошибками.

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

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


Рейтинг:
2

Patrice T

Мой лайк идет к первому варианту.
Но я использую оба в зависимости от ситуации, нет абсолютного правила.


Рейтинг:
2

BillWoodruff

Я не думаю, что эти два примера сопоставимы. Когда цикл во втором примере завершается, информация сохраняется в переменной 'tentatives, которая сообщит вам, сколько итераций произошло, чтобы найти совпадение ... если он найдет совпадение. В первом примере количество итераций не сохраняется.

Обычный дискриминационный фактор при выборе "Для против" while заключается в том, знаете ли Вы количество итераций, которые необходимо выполнить. Я нахожу полезным для студентов C# предложить думать о том, что "for as" повторяет это много раз; с "while я предлагаю аналогию" продолжайте делать это до тех пор, пока что угодно". с "do-while" продолжайте делать это до тех пор, пока что угодно".


Рейтинг:
0

CPallini

Я обычно иду с первым вариантом (даже с return, если это уместно) из-за меньшего количества кода для ввода и просмотра.
Однако это всего лишь личный вкус.