В C # это for (;;) безопасно и что оно действительно делает? - PullRequest
12 голосов
/ 08 октября 2010

Я нашел пустой оператор for в существующем фрагменте кода, и мне интересно, что он делает и является ли он "безопасным". Это просто неправильно.

for(;;)
{
   //some if statements and a case statement
}

Спасибо! * * 1004

Ответы [ 10 ]

17 голосов
/ 08 октября 2010

Это один из способов создания бесконечного цикла. Это обычный цикл for, но с пустыми выражениями инициализации, условия и приращения. Поскольку выражение условия не используется, цикл никогда не завершается. Это совершенно «безопасно», если предположить, что где-то есть условие завершения (оператор break или return [или даже goto, я полагаю]).

Лично я предпочитаю писать бесконечные циклы с while s:

while (true) 
{  
    //some statements and a case statement
}

(потому что for для итерации и while для повторения ).

Однако после прочтения этого вопроса (связан с @jailf) я теперь предпочитаю while (42) { ... }.

5 голосов
/ 08 октября 2010

Это эквивалентно бесконечному циклу:

while (true) {

}

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

4 голосов
/ 08 октября 2010

Это общая идиома для неопределенного или бесконечного цикла . Вы намеренно можете иметь неопределенный цикл, если вы ищете условие, которое не является конечным в начале - например, пользовательский ввод или конец файла неизвестного размера. Вы также можете увидеть while(1) или while(true) для того же. Там написано «делай это {что угодно}, пока не будет больше ...»

Внутри этой структуры цикла, вероятно, есть условный оператор break , например:

for(;;)
{
    Console.Write("Enter your selection (1, 2, or 3): ");
    string s = Console.ReadLine();
    int n = Int32.Parse(s);

    switch (n)
    {
        case 1:
           Console.WriteLine("Current value is {0}", 1);
           break;
        case 2:
           Console.WriteLine("Current value is {0}", 2);
           break;
        case 3:
            Console.WriteLine("Current value is {0}", 3);
            break;
        default:
           Console.WriteLine("Sorry, invalid selection.");
           break;
        }
    if(n==1 || n==2 || n==3)
        break; // out of the for(;;) loop    

 }

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

Больше на сайте C # для for: ЗДЕСЬ

3 голосов
/ 08 октября 2010

Об этом много раз спрашивали на SO. Лучшее обсуждение по теме по следующей ссылке:

Является ли "for (;;)" быстрее, чем "while (TRUE)"? Если нет, то почему люди используют его?

3 голосов
/ 08 октября 2010

Это то же самое, что и while (true) { /**/ } ... бесконечный цикл до тех пор, пока не произойдет break или return или подобное.

Все, что он действительно "делает", выглядит уродливым ИМО;)

3 голосов
/ 08 октября 2010

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

> for (; ; ) {
>     // ... }

Взято из MSDN

2 голосов
/ 08 октября 2010

Иногда это называется «вечным» циклом, потому что это то, что он делает.Ищите оператор break; или return; внутри цикла или цикл, который нужно обернуть в блок try / catch.Лично я стараюсь избегать подобных вещей.

2 голосов
/ 08 октября 2010

Это правильный синтаксис для бесконечного цикла. Вам нужно "сломать"; из этого. Это было популярно еще во времена C ++ IIRC.

Насколько безопасно, вы правы, чувствуя себя "неправильно" по этому поводу. Обычно внутри возникает условие «если», когда вы решаете, продолжать ли цикл или прервать его. Если вы не проверите все пути выполнения, это вполне может привести к бесконечному циклу. Я бы попытался сделать это другим способом.

1 голос
/ 08 октября 2010

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

1 голос
/ 08 октября 2010

Были ли какие-либо заявления break, return или throw?Это единственный выход.Это безопасно?Это зависит от того, чувствуете ли вы себя в безопасности внутри бесконечного цикла.Некоторым приложениям нужен один.

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