19.for文とuintではまった!

ブラウザが固まる

ん?というようなところですごくはまりました。

しかも具合の悪いことに、実行のたびにブラウザが固まり、「応答なし」状態になってしまい、ブラウザを強制終了、再度起動、というなんとも面倒なことに。

もう何回、強制終了&再度立ち上げをやったことか、、、ホント、時間がかかるのでイライラしました。

ようやく不具合の原因がわかったので、まとめておこうかな、と。

不具合のあるfor文

はまった部分を調べていくと、、、行き着いた部分を単純化したのが下のfor文。

これを実行するとブラウザが固まりますのでご注意を(^^;

var ii:uint;
for (ii=3;ii>=0;ii--){
//処理
}

このfor文、単にiiが3,2,1,0の各場合で処理をしておくれ、というだけのものです。

たいていは、0→1→2→3と順に処理することが多いですが、時にはこういうのも使いますよね。

知らなかったfor文

調べてて初めて気付きました。for文が終わった時に変数の値がどうなってるのか、を。

例えば、以下のfor文が終わった時点で、変数jjの値はいくらでしょう?

for (jj=0;jj<=5;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 という条件を満たすので、結局延々と計算し続けることに、、、実際はブラウザが固まってしまうわけです。

for文テスト

右の実行結果の画像では、iiのfor文(▲のところ)ではいくつ表示させたかを数えて、ある値のところで強制終了させてます。

でないとブラウザが応答なしになってしまいますので。

今回の件、よく考えれば、そりゃそうなるわな、という内容なのですが、、、

ブラウザが固まらなくても、注意・警告してくれてもいいのに!なんて思ったりして。

そういうのがないから処理速度が速かったりするのかな?

ともかく、こういうfor文ではint型にして計算することにしました。

めでたし、めでたし(^^)

→20.正規表現

18.ガウス・ジョルダン法のクラス←