1

修正は簡単で費用もかからないため、これは実際には問題ではありません。私はそれが何かの特性であるforuint、私が理解していないことを推測していて、何が起こっているのか知りたいだけです...

forActionScript 3 を使用して、 a の要素を逆方向に実行するループを設定しましたVector

var limit:uint = myVector.length-1;
for(var a:uint = limit; a >= 0; a--)
{
    trace(a);
}

これを実行すると、期待どおりに出力2, 1, 0されますが、次に進み4294967295、そこからカウントダウンを開始し、ループがタイムアウトしてError #1502.

修正は単にaasintではなく入力するuintことですが、理由がわかりません。確かに私は 0 以上の値を扱っているのでuint、正しいデータ型は正しいですか?

4294967295それが最大値だと思いuintますが、カウントはどのようにそこに到達しますか?

もしあなたがそうするなら

var myUint:uint = 0;
trace(myUint - 1);

次に、出力は-1なぜ、私のループで突然ジャンプして戻る必要があるの4294967295ですか?

少しとりとめのない質問で申し訳ありませんが、何か助けていただければ幸いです。

4

3 に答える 3

4

あなたは近くにいます。あなたが言ったように、ループは 2, 1, 0, 4294967295 を返します。これは、uint が負になることができないためです。ループは常に実行さa >= 0れ、ループ条件を破るために -1 になることはないため、ループは永遠に続きます。

var myUint:uint = 0;
trace(myUint - 1);

私はこれをテストしませんでしたが、おそらく起こっているのは、myUint が int に変換されてから 1 が減算されていることです。次のコードでこれを確認できるはずです。

var myUint:uint = 0;
trace((myUint - 1) is uint);
trace((myUint - 1) is int);

ループを修正するには、int を使用するfor each(var x:Type in myVector)か、インデックス ( ) が必要ない場合はループを使用できますa

于 2013-09-04T10:15:02.353 に答える
3

a が 0 の場合、反復と a-- が発生します。したがって、int が署名されていないため、この型の最大値が設定されます -> これは、マイナス値が unsigned 型に設定される方法です。

コードを次のように変更します。

var limit:uint = myVector.length-1;
for(var a:uint = limit; a > 0; a--)
{
    trace(a);
}
于 2013-09-04T10:04:42.753 に答える