DefaultForeColor достаточно для этого утверждения. Это свойство получает цвет переднего плана по умолчанию для элемента управления.
lblExample.ForeColor = DefaultForeColor;
Я считаю, что есть случаи, когда существование кажущихся бесконечными циклов нормально. Однако, похоже, это не один из них. Похоже, вы могли бы так же легко написать код следующим образом
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;
Кажется, это лучше выражает истинное предназначение цикла
Я согласен с другими ответами, что в этом случае нет необходимости в бесконечном цикле.
Однако другой момент может заключаться в том, что когда у вас есть бесконечный цикл loop, for (;;)
может быть лучшим способом выразить это. Некоторые компиляторы генерируют предупреждения для while (true)
(условие всегда оценивается как false), и ваше намерение менее ясно, потому что оно похоже на любой другой цикл. Возможно, раньше было сказано while (x == true)
, и вы случайно удалили x
вместо true
. for (;;)
довольно ясно говорит о том, что это должен быть бесконечный цикл. Или, возможно, вы намеревались написать что-то вроде while (t)
, но Intellisense в вашей среде IDE сработал и решил выполнить автозаполнение до true
.
для (;;)
, с другой стороны, это не то, что вы когда-либо напечатали бы случайно. (и его легче искать. while (true) также можно записать как while (1))
Ни одна из версий не неверна , но для (;;)
может быть более интуитивно понятен, потому что не соответствует условию цикла.
Мои два цента: код должен быть самодокументированным . То есть, получив фрагмент кода, я бы предпочел посмотреть и сказать о намерениях программиста, а затем прочитать комментарии или пройтись по окружающему коду. Когда я прочитал:
while(true)
Это говорит мне, что программист хотел бесконечный цикл; что конечное условие не может быть указано. Это намерение программистов в некоторых случаях; серверный цикл, например, и именно тогда его следует использовать.
В приведенном выше коде цикл не предназначен для вечного существования, он имеет четкое конечное условие и для того, чтобы быть семантически понятным, как и другие указали:
while (currentVal != searchVal)
работает, поэтому while (true) явно хуже, и его следует избегать в этом случае.
Бывают времена и места для бесконечных циклов - я не уверен, что это одно из них. С другой стороны, это далеко не вопиющая проблема.
while (currentVal != searchVal)
{
...
}
return true;
Их можно использовать, когда процесс действительно неопределенный - процесс-демон с циклом монитора, который не завершается.
Бывают ситуации, когда такая конструкция имеет смысл:
Что ж, комментарий о том, что это не бесконечный цикл, может помочь:
while (true) // Not really an infinite loop! Guaranteed to return.
Я согласен, что он должен имеют условие, но в некоторых ситуациях это нормально (и не всегда возможно или легко создать условие).
while (true)
используется в играх для основного игрового цикла - игры постоянно читают ввод игрока, обрабатывают взаимодействия между объектами и раскрашивают экран, а затем повторяют. Этот цикл продолжается бесконечно, пока какое-либо другое действие не прервется из этого цикла (выход из игры, завершение уровня).
Я попытался быстро найти этот основной цикл в исходном коде Quake 1, но было по крайней мере 50 вхождений из « while (1)
», а также некоторые, написанные как « for (;;)
», и я не сразу понял, какой из них был основным игровым циклом.
Хотя я делал это раньше, я бы проголосовал за то, чтобы всегда пытаться найти более четкое решение, используя что-то читабельное, что обычно включает допустимое выражение в цикл while - в противном случае вы сканируете код в поисках обрыва.
Я не очень боюсь их или чего-то подобного, но я знаю, что некоторые люди боятся.
Хватит волноваться. Это неплохой вариант, если он помогает упростить логику кода и улучшить ремонтопригодность и читаемость. Тем не менее, стоит задокументировать в комментариях ожидаемые условия выхода и то, почему алгоритм не зациклится.
Ну, да , но две страницы кода, которые вы должны написать, если вы не хотите, чтобы ваш основной цикл был чем-то вроде в то время как (true)
даже хуже форма.
Нередко можно найти бесконечные циклы в коде встроенных систем - часто окружающие конечные автоматы, проверку периферийных микросхем и устройств и т. Д.
Мне нравятся бесконечные циклы как внешняя управляющая структура конечного автомата. По сути, это структурированный 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();
}