Подтвердить что ты не робот

В С# является for (;;) безопасным и что он действительно делает?

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Он эквивалентен как бесконечный цикл:

while (true) {

}

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

Ответ 3

Это распространенная идиома для неопределенного или бесконечного цикла. Вы намеренно можете иметь неопределенный цикл, если вы ищете условие, которое не является конечным в начале - например, ввод пользователя или конец файла неизвестного размера. Вы можете также видеть 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    

 }

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

Подробнее на сайте С# для for: ЗДЕСЬ

Ответ 4

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

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

Взято из MSDN

Ответ 5

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

Все это действительно "делает" выглядит уродливым IMO;)

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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