continueステートメントは、ループ処理において、以降のステートメントをスキップして、つぎのループに処理を移します。ifやswitchステートメントは、continueが制御を移す対象ではありません。ところが、switchステートメントで、この勘違いが起こるようです。Flash MX 2004で確認された問題です。
つぎのスクリプトを、[ムービープレビュー]で実行してみましょう。カウンタ変数nが2のときのみ[出力]が変わり、あとはカウンタnの値以外同じ[出力]結果が表示されるはずです。
■スクリプト001
var n = 5, nCount = 5;
while (--n) {
trace("while loop: n = "+n);
switch (n) {
case 2 :
if (!(--nCount)) {
return;
}
trace("case 2: n = "+n+", nCount = "+nCount);
continue; // コメントアウトすれば正しい動作
}
}
しかし、[出力]パネルの表示はつぎのとおりです(出力結果001)。
■出力結果001
while loop: n = 4
while loop: n = 3
while loop: n = 2
case 2: n = 2, nCount = 4
case 2: n = 2, nCount = 3
case 2: n = 2, nCount = 2
case 2: n = 2, nCount = 1
continueステートメントは本来つぎのループ処理に制御を移さなければならないのに、実際にはswitchをループ処理と誤って認識してしまっているようです。そのため、カウンタ変数nが変更されないまま、switchステートメントを繰返し処理しています。
このサンプルスクリプト001の場合には、continueステートメントの後に処理が記述されていません。したがって、continueをコメントアウトすれば、本来の[出力]結果002が表示されます。
■出力結果002
while loop: n = 4
while loop: n = 3
while loop: n = 2
case 2: n = 2, nCount = 4
while loop: n = 1
なお、swichステートメントは、ifで書替えることが可能です。ifステートメントでは、continueは正しく動作します([出力]結果は上記002と同じなので、省略します)。
■スクリプト002
var n = 5, nCount = 5;
while (--n) {
trace("while loop: n = "+n);
if (n == 2) {
if (!(--nCount)) {
return;
}
trace("case 2: n = "+n+", nCount = "+nCount);
continue;
}
}
Flash MXでも、同じ問題が発生します。ただし、MXでは、怪我の功名でたまたま正しく動作することがあります。それは、[自動フォーマット]を実行した場合です。Flash MXのオーサリング環境は、[自動フォーマット]を実行すると、switchブロック内のcontinueを消去してしまいます。そのため、先にご紹介したサンプル001では、たまたま目的の結果が得られます。もちろんこれはこれで、とんでもないバグです。
この記事へのコメント
●1.宮地 成太郎(2004年06月05日 20:22)
>>[自動フォーマット]を実行すると、switchブロック内のcontinueを消去してしまいます。
これは確信犯な気がしますね。