0

これは期待どおりに機能します。

for (var i:uint = 5; i >= 1; i-- ) 
{   
    trace(i);  // output is from 5~1, as expected
}

これは奇妙な振る舞いです:

for (var i:uint = 5; i >= 0; i-- ) 
{   
    trace(i)
}

// output:
5
4
3
2
1
0
4294967295
4294967294
4294967293
... 

0未満では、MAX_INTのようなものが表示され、永久にデクリメントされ続けます。なぜこうなった?

編集

unsignedintを使用してC++を使用して同様のコードをテストしたところ、同じ結果が得られました。おそらく、状態はデクリメント後に評価されています。

4

1 に答える 1

3

あなたが説明している振る舞いは、プログラミング言語とはほとんど関係がありません。これは、C、C ++、actionscriptなどにも当てはまります。ただし、これは非常に正常な動作であり、数値の表現方法に関係しています(wikiの記事を参照し、符号なし整数について読んでください)。

uint符号なし整数)を使用しているため。これは正の数のみである可能性がありますが、使用しているタイプは負の数を表すことができないため、次のようなuintを使用する場合は次のようになります。

uint i = 0;

そして、あなたは上から1を減らします

i = i - 1;

この場合i、符号なしであるため、負の数を表すことはありません。次に、データ型iの最大値を表示します。uint

上に投稿した編集、

「...C++では、..同じ結果...」

なぜこれが起こっているのかについての手がかりを与えるはずですが、それはあなたが使用している言語や比較がいつ行われるかとは何の関係もありません。使用しているデータ型と関係があります。

演習として、そのC ++プログラムを再度起動し、の最大値を表示するプログラムを作成しますuint。プログラムは定義された定数を表示しないはずです:)..それはあなたにも1行のコードを必要とします!

于 2012-08-15T17:49:21.147 に答える