我想要一个使用UInt16(ushort)循环遍历其所有值的循环。但是,这不会这样做:

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

问题是当i == 0xFFFF而不是<!>时,循环将退出<!>做一些<!>“; 如果我将'for'语句更改为<!> quot; for(ushort i = 0; i <!> lt; = UInt16.MaxValue; i ++)<!> quot;,那么它将变为无限循环,因为我永远不会得到到0x10000因为ushorts只到0xFFFF。

我可以将'i'设为int并将其转换为或将其分配给循环中的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);

你可以简单地用do-while循环代替for。

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

它必须是短吗?为什么不呢

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

假设您的代码遭遇一个错误(当前代码,在评估最终值之前停止。那么以下内容可能会回答您。

非常简单,因为你的计数器是一个16位无符号整数,它的值不能大于0xffff,因为该值仍然有效,你需要有一些超出保护的值。但是,将1添加到16位的0只是包含在<=>中。如建议的那样,要么使用do while循环(不需要保护值),要么使用更大的值来包含计数器。

PS。在现代机器上使用16位变量实际上比使用32位变量效率低,因为不需要生成溢出代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top