19.for文とuintではまった!
ブラウザが固まる
ん?というようなところですごくはまりました。
しかも具合の悪いことに、実行のたびにブラウザが固まり、「応答なし」状態になってしまい、ブラウザを強制終了、再度起動、というなんとも面倒なことに。
もう何回、強制終了&再度立ち上げをやったことか、、、ホント、時間がかかるのでイライラしました。
ようやく不具合の原因がわかったので、まとめておこうかな、と。
不具合のあるfor文
はまった部分を調べていくと、、、行き着いた部分を単純化したのが下のfor文。
これを実行するとブラウザが固まりますのでご注意を(^^;
for (ii=3;ii>=0;ii--){
//処理
}
このfor文、単にiiが3,2,1,0の各場合で処理をしておくれ、というだけのものです。
たいていは、0→1→2→3と順に処理することが多いですが、時にはこういうのも使いますよね。
知らなかったfor文
調べてて初めて気付きました。for文が終わった時に変数の値がどうなってるのか、を。
例えば、以下のfor文が終わった時点で、変数jjの値はいくらでしょう?
//処理
}
正解は5ではなく、6になってるんです!(この頁の下の方にちょろっと結果の画像あります)
わたしゃ、知りませんでしたあっ!
知らなかった、というか意識する必要がなかったわけで。
for文が終わったら変数(ここではjj)の値なんて使いませんし。
実際、jj++をして6にしないとjj<=5が成立するかどうか判断できませんからね。
uintと組み合わせてトラブル
AS3になり数値のデータ型がNumberだけでなく、intとuintとNumberに増えたそうで。
なんでもuint(正の整数)型にすると処理速度が速い!と聞いたのでたいてい整数はuintにしています。
ちなみにこのuintがとりうる値は 0 〜 4,294,967,295 です。
この時、最初のfor文はどうなるか?
変数iiはuintに指定してますので、最後(にしたい)のii=0での処理後、次のループでiiは1小さくなり、、、
いや、ならないんですよね。
iiはuintで宣言していますので、0から1を引いた値は4,294,967,295になるんです。
すると、for文の ii>=0 という条件を満たすので、結局延々と計算し続けることに、、、実際はブラウザが固まってしまうわけです。

右の実行結果の画像では、iiのfor文(▲のところ)ではいくつ表示させたかを数えて、ある値のところで強制終了させてます。
でないとブラウザが応答なしになってしまいますので。
今回の件、よく考えれば、そりゃそうなるわな、という内容なのですが、、、
ブラウザが固まらなくても、注意・警告してくれてもいいのに!なんて思ったりして。
そういうのがないから処理速度が速かったりするのかな?
ともかく、こういうfor文ではint型にして計算することにしました。
めでたし、めでたし(^^)