2016-07-27 3 views
-2

я наткнулся на этот кодFor Loop без условия

var i=Array.ConvertAll(Console.ReadLine().Split(),int.Parse); 
for(int x=i[0]-i[2],y=i[1]-i[3];;Console.WriteLine((0!=y?0<y--?"S":"N":"")+(0!=x?0<x--?"E":"W":""))); 

Я думаю, что я понимаю int x=i[0]-i[2],y=i[1]-i[3], но та часть, которая меня смущает то, что нет никакого конца состояния. Итак, мой вопрос: как завершается этот цикл?

Я видел этот ответ, в котором говорится о бесконечной петле.

For Loop without condition

+2

Я все за то, что вырубил переменный беспорядок, однако, это очень тупой код. –

+0

Все три раздела (инициализатор, условие, итератор) объявления цикла являются необязательными. Это означает, что 'for (;;)' является синонимом 'while (true)'. – spender

+0

Это бесконечный цикл. Как указано в ответе ниже, все три раздела являются необязательными. @lrb выглядит как задача «прочитать этот код», скопированную из какой-то скрученной книги C++ (аналогичные конструкции могут быть элегантными в C++, хотя imho) –

ответ

4

В языках программирования, существуют циклы, которые написаны для запуска постоянно, если какое-то внешнее условие (например, исключение, или сигнал пользователя) не будет получен. Несколько раз такие «бесконечные» петли записываются по ошибке.

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

+0

Хмм, мне нужно снова смотреть, потому что цикл не бесконечен. Mabe что-то еще вызывает его прекращение. – Mike

+0

Выведенный фрагмент кода не показывает никаких условий выхода, но, конечно, он будет там, если вы это увидите. :-) – PNS

0

Петля

for(int x=i[0]-i[2],y=i[1]-i[3];;Console.WriteLine((0!=y?0<y--?"S":"N":"")+(0!=x?0<x--?"E":"W":""))); 

от вопроса никогда не придет к концу. Вы можете проверить это, положив что-то вроде Console.WriteLine("Loop finished, yet.") после него. Эта линия никогда не будет достигнута.

, что вы видите, что цикл независимо подходит к концу, может иметь одну из этих причин:

  • В зависимости от пользовательского ввода для ReadLine-выписки, инициализирует массив или доступ к его int x=i[0]-i[2],y=i[1]-i[3] приведет к исключению. Тогда цикл не будет выполнен.
  • Возможно, поток, в котором выполняется цикл, прерывается.
  • Если цикл выполняется без прерывания потока или чего-то еще, переменные цикла x и y в конечном итоге оба будут равны нулю. Тогда цикл будет производить только пустые строки. Возможно, это неверно истолковывает это как конец. Но цикл все еще продолжается. (Обе переменные x и y в конечном итоге будут равны нулю, поскольку на каждом шаге они уменьшаются на 1, если они не равны нулю. Если они начинаются с отрицательных значений, они достигнут наименьшего возможного целочисленного значения, после чего они достигнут максимально возможного целое число, положительное, тогда они будут уменьшаться нормально, пока они не достигнут нуля. Тогда они всегда останутся равными нулю.)

Тем не менее, цикл бесконечен. Если он прерывается, причина этого определенно не в том цикле, только снаружи.

На мой взгляд, итерационная часть цикла for предназначена только для изменения переменных цикла. Один изобрел часть тела петли для другого материала, такого как экран-выход или что-то в этом роде. Следовательно, этот цикл выше - это плохой код.

Смежные вопросы