6

UInt16 (ushort) を使用してすべての値をループするループが必要です。しかし、これはそれをしません:

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

問題は、i == 0xFFFF のときにループが終了し、「何かを実行」しないことです。「for」ステートメントを「for(ushort i = 0; i <= UInt16.MaxValue; i++ )」に変更すると、ushort は 0xFFFF にしか移動しないため、0x10000 に到達しないため、無限ループになります。

「i」を int にしてキャストするか、ループ内の ushort 変数に割り当てることができます。

助言がありますか?

4

5 に答える 5

17

do...whileループを使う

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

上部と下部のループのテストに関する興味深い議論がここにあります

于 2008-10-23T19:27:46.903 に答える
5

UInt16.MaxValue0xffffではなくに評価され0x10000ます。burkhard1979 の答えのバリエーションとして、do/ループでこれを行うことができると思います。while

ushort i = 0;
do {
   ...
} while (++i != 0);
于 2008-10-23T19:47:43.430 に答える
4

for を do-while ループに置き換えるだけです。

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
于 2008-10-23T19:28:10.007 に答える
1

短くする必要がありますか?なぜだけではないのですか

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}
于 2008-10-23T20:02:28.597 に答える
1

あなたのコードが 1 つのエラーによるオフに苦しんでいると仮定すると (現在のコードは、最終的な値が評価される直前に停止します。その場合、次のように答えることができます。

非常に単純です。カウンターは 16 ビットの符号なし整数であるため、 より大きい値を持つことはできません0xffff。その値はまだ有効であるため、ガードとしてそれを超える値が必要です。ただし、に 16 ビットを追加1すると、 にラップするだけです。提案されているように、do while ループ (ガード値を必要としない) を使用するか、より大きな値を使用してカウンターを含めます。0xffff0

ps。最新のマシンで 16 ビット変数を使用すると、オーバーフロー コードを生成する必要がないため、実際には 32 ビット変数を使用するよりも効率が低下します。

于 2008-10-23T20:20:43.443 に答える