continueの勘違い [Edit]

continueステートメントは、ループ処理において、以降のステートメントをスキップして、つぎのループに処理を移します。ifswitchステートメントは、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. 1.宮地 成太郎(2004年06月05日 20:22)

    >>[自動フォーマット]を実行すると、switchブロック内のcontinueを消去してしまいます。

    これは確信犯な気がしますね。

その他の記事