Вопрос

Мне нужен цикл, который использует UInt16 (ushort) для перебора всех своих значений.Однако это не делает этого:

for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
    // do something
}

Проблема в том, что цикл завершится, когда i == 0xFFFF, а не «что-то сделает».Если я изменю оператор for на for(ushort i = 0;я <= UInt16.MaxValue;i++ )", тогда это становится бесконечным циклом, потому что я никогда не добираюсь до 0x10000, потому что ushorts переходят только на 0xFFFF.

Я мог бы сделать 'i' целым числом и привести его или присвоить переменной ushort в цикле.

Какие-либо предложения?

Это было полезно?

Решение

Используйте do...while цикл

ushort i = 0;
do
{
    // do something
} while(i++ < UInt16.MaxValue);

Существует интересное обсуждение циклов тестирования сверху и снизу .

Другие советы

UInt16.MaxValue оценивается как 0xffff не 0x10000. Я думаю, что вы можете сделать это с помощью цикла do / while, как вариант ответа burkhard1979.

ushort i = 0;
do {
   ...
} while (++i != 0);

Вы можете просто заменить for на цикл do-while.

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);

это должно быть коротким? почему не просто

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}

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

Очень просто, поскольку ваш счетчик представляет собой 16-битное целое число без знака, он не может иметь значения, превышающие 0xffff, поскольку это значение все еще действительно, вам необходимо иметь какое-то значение, выходящее за рамки защитного значения.Однако добавление 1 к 0xffff в 16 битах просто оборачивается 0.Как предложено, либо используйте цикл do while (который не требует защитного значения), либо используйте большее значение для хранения счетчика.

пс.Использование 16-битных переменных на современных машинах на самом деле менее эффективно, чем использование 32-битных переменных, поскольку не требуется генерировать код переполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top