質問
UInt16(ushort)を使用してすべての値をループするループが欲しい。ただし、これではできません。
for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
// do something
}
問題は、<!> quot; do something <!> quot;ではなく、i == 0xFFFFのときにループが終了することです。 「for」ステートメントを<!> quot; for(ushort i = 0; i <!> lt; = UInt16.MaxValue; i ++)<!> quot;に変更すると、無限ループになります。 ushortsは0xFFFFにしか移動しないため、0x10000になります。
「i」をintにしてキャストするか、ループ内のushort変数に割り当てることができます。
提案はありますか
解決
do...while
ループを使用
ushort i = 0;
do
{
// do something
} while(i++ < UInt16.MaxValue);
上と下でループをテストする興味深い議論がありますこちら。
他のヒント
UInt16.MaxValue
は0xffff
ではなく、0x10000
。 burkhard1979の答えのバリエーションとして、do
/ while
ループでこれを行うことができると思います。
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
}
コードが1つのエラー(現在のコードは、最終的な値が評価される直前に停止します。次のように答えます。
カウンターは16ビットの符号なし整数であるため、0xffff
より大きな値を設定することはできません。その値はまだ有効であるため、ガードとしてそれを超える値が必要です。ただし、16ビットで1
に0
を追加すると、<=>に折り返されます。提案されているように、do whileループ(ガード値を必要としない)を使用するか、カウンターを含めるためにより大きな値を使用します。
ps。オーバーフローコードを生成する必要がないため、最新のマシンで16ビット変数を使用することは、実際には32ビット変数を使用するよりも効率的ではありません。