题
我想要一个使用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位变量效率低,因为不需要生成溢出代码。
不隶属于 StackOverflow