我想要一个使用UInt16(ushort)循环遍历其所有值的循环。但是,这不会这样做:
for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
// do something
}
问题是当i == 0xFFFF而不是“做某事”时,循环将退出。 如果我将'for'语句更改为“for(ushort i = 0; i&lt; = UInt16.MaxValue; i ++)”,那么它将变为无限循环,因为我永远不会达到0x10000,因为ushorts只会转到0xFFFF。
我可以将'i'设为int并将其转换为或将其分配给循环中的ushort变量。
有什么建议吗?
答案 0 :(得分:17)
使用do...while
循环
ushort i = 0;
do
{
// do something
} while(i++ < UInt16.MaxValue);
有一个有趣的讨论在顶部与底部here测试循环。
答案 1 :(得分:5)
UInt16.MaxValue
evaluates to 0xffff
,而不是0x10000
。我认为您可以使用do
/ while
循环执行此操作,作为burkhard1979答案的变体。
ushort i = 0;
do {
...
} while (++i != 0);
答案 2 :(得分:4)
你可以简单地用do-while循环代替for。
ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
答案 3 :(得分:1)
它必须是短吗?为什么不呢
for(int i = 0;i<=0xFFFF;i++)
{
//do whatever
}
答案 4 :(得分:1)
假设您的代码遭遇一个错误(当前代码,在评估最终值之前停止。那么以下内容可能会回答您。
非常简单,因为你的计数器是16位无符号整数,它的值不能大于0xffff
,因为该值仍然有效,你需要有一些超出保护的值。但是,将1
添加到16位中的0xffff
只会绕回0
。如建议的那样,要么使用do while循环(不需要保护值),要么使用更大的值来包含计数器。
PS。在现代机器上使用16位变量实际上比使用32位变量效率低,因为不需要生成溢出代码。