Бесконечные циклы в невоспитанности?

DefaultForeColor достаточно для этого утверждения. Это свойство получает цвет переднего плана по умолчанию для элемента управления.

lblExample.ForeColor = DefaultForeColor;
7
задан Jon Seigel 18 April 2010 в 00:02
поделиться

12 ответов

Я считаю, что есть случаи, когда существование кажущихся бесконечными циклов нормально. Однако, похоже, это не один из них. Похоже, вы могли бы так же легко написать код следующим образом

while (current_val != searchVal ) {
    MapType::iterator it = myMap.find(current_val);
    assert(current_val != myMap.end());
    if (current_val == it->second) // end of the line
        return false;
    current_val = it->second
}
return true;

Кажется, это лучше выражает истинное предназначение цикла

22
ответ дан 6 December 2019 в 04:47
поделиться

Я согласен с другими ответами, что в этом случае нет необходимости в бесконечном цикле.

Однако другой момент может заключаться в том, что когда у вас есть бесконечный цикл loop, for (;;) может быть лучшим способом выразить это. Некоторые компиляторы генерируют предупреждения для while (true) (условие всегда оценивается как false), и ваше намерение менее ясно, потому что оно похоже на любой другой цикл. Возможно, раньше было сказано while (x == true) , и вы случайно удалили x вместо true . for (;;) довольно ясно говорит о том, что это должен быть бесконечный цикл. Или, возможно, вы намеревались написать что-то вроде while (t) , но Intellisense в вашей среде IDE сработал и решил выполнить автозаполнение до true .

для (;;) , с другой стороны, это не то, что вы когда-либо напечатали бы случайно. (и его легче искать. while (true) также можно записать как while (1))

Ни одна из версий не неверна , но для (;;) может быть более интуитивно понятен, потому что не соответствует условию цикла.

5
ответ дан 6 December 2019 в 04:47
поделиться

Мои два цента: код должен быть самодокументированным . То есть, получив фрагмент кода, я бы предпочел посмотреть и сказать о намерениях программиста, а затем прочитать комментарии или пройтись по окружающему коду. Когда я прочитал:

while(true)

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

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

while (currentVal != searchVal)

работает, поэтому while (true) явно хуже, и его следует избегать в этом случае.

13
ответ дан 6 December 2019 в 04:47
поделиться

Бывают времена и места для бесконечных циклов - я не уверен, что это одно из них. С другой стороны, это далеко не вопиющая проблема.

while (currentVal != searchVal)
{
    ...
}
return true;

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

6
ответ дан 6 December 2019 в 04:47
поделиться

Бывают ситуации, когда такая конструкция имеет смысл:

  1. Условие прерывания вычисляется внутри цикла
  2. Есть другие условия прерывания, и все они одинаково важны
  3. Вы действительно нужен бесконечный цикл;) ..
5
ответ дан 6 December 2019 в 04:47
поделиться

Что ж, комментарий о том, что это не бесконечный цикл, может помочь:

    while (true) // Not really an infinite loop! Guaranteed to return.

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

0
ответ дан 6 December 2019 в 04:47
поделиться

while (true) используется в играх для основного игрового цикла - игры постоянно читают ввод игрока, обрабатывают взаимодействия между объектами и раскрашивают экран, а затем повторяют. Этот цикл продолжается бесконечно, пока какое-либо другое действие не прервется из этого цикла (выход из игры, завершение уровня).

Я попытался быстро найти этот основной цикл в исходном коде Quake 1, но было по крайней мере 50 вхождений из « while (1) », а также некоторые, написанные как « for (;;) », и я не сразу понял, какой из них был основным игровым циклом.

4
ответ дан 6 December 2019 в 04:47
поделиться

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

Я не очень боюсь их или чего-то подобного, но я знаю, что некоторые люди боятся.

1
ответ дан 6 December 2019 в 04:47
поделиться

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

0
ответ дан 6 December 2019 в 04:47
поделиться

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

0
ответ дан 6 December 2019 в 04:47
поделиться

Нередко можно найти бесконечные циклы в коде встроенных систем - часто окружающие конечные автоматы, проверку периферийных микросхем и устройств и т. Д.

0
ответ дан 6 December 2019 в 04:47
поделиться

Мне нравятся бесконечные циклы как внешняя управляющая структура конечного автомата. По сути, это структурированный goto:

for (;;) {
    int c = ReadInput();
    if (c == EOF)
        return kEOF;

    switch (state) {
    case inNumber: state = HandleNumber(c); break;
    case inToken: state = HandleToken(c); break;
    case inWhiteSpace: state = HandleWhiteSpace(c);
    default:
       state = inError;
       break;
    }
    if (state == inError) ThrowError();

}

0
ответ дан 6 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: