Показать сообщение отдельно

  #4  
Старый 20.12.2009, 02:35
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от M_script_  
Algol, миниквест пора заканчивать. Говори правильный ответ. Мне кажется постпроверка с префиксным инкрементом в этом случае оптимальный вариант. По крайней мере по количеству используемой памяти )
Эээ... А разве здесь может быть правильный ответ
Правильный - любой который работает
Лично я бы писал так как предлагал slesh:
Код:
for(byte b=0;b<=255;b++)
{
  Console.WriteLine(b);
  if(b==255) break;
}
Некрасиво конечно, но по другому не получится.

Еще мне понравился вариант desTiny, что на C# выглядело бы типа такого
Код:
byte b = 0;
do
      Console.WriteLine(b);
      b++;
while(b!=0);
Он конечно содержит минимум операторов, но у него есть недостаток - он в общем случае не работает, если границы перебора заранее не известны.

Да и кстати, вообще-то я спрашивал почему же исходный код не работает, а все почему то начали приводить примеры работающих кодов

Раз никто не ответил, отвечу сам:
На самом деле, в си-подобных языках нет оператора for в чистом виде. Фактически for это цикл while, для которого указано условие продолжения (b<=255) и некторый оператор, изменяющий b (b++).
Причем условние продолжения цикла проверяется на каждой итерации.
Когда значение b достигает 255, цикл отрабатывает, и далее выполняется операция b++, результатом которой является снова 0! Далее проверяется условие b<=255 - оно очевидно выполняется, и цикл идет дальше, таким образом зацикливаясь в бесконечность.
Для си в принципе это поведение нормальное, однако для C# лично мне это кажется не очень логичным поведением. Логичнее было бы на 255++ генерировать исключение (что то типа OverflowException) - ведь фктически происходит переполение. Но нет, он тихо сбрасывается в ноль и идет себе дальше
Точно такая же ситуация возникает и для всех остальных целочисленных типов. Например цикл
for(int i=0;i<=int.MaxInt;i++) - тоже зацикливается.
Получается что стандартный код типа
for(int i=1;i<=arr.Count;i++)
является небезопасным, так как если arr.Count==int.MaxInt, то цикл будет бесконечным :[

Последний раз редактировалось Algol; 20.12.2009 в 02:37..
 
Ответить с цитированием