20

このコードの実行

var myValue1:int = 2;
switch (myValue1)
{
    case -3: trace(myValue1 + " == -3"); break;
    case -2: trace(myValue1 + " == -2"); break;
    case -1: trace(myValue1 + " == -1"); break;
    case 0:  trace(myValue1 + " == 0"); break;
    case 1:  trace(myValue1 + " == 1"); break;
    case 2:  trace(myValue1 + " == 2"); break;
    case 3:  trace(myValue1 + " == 3"); break;
    default: trace(myValue1 + " is unknown"); break;
}

var myValue2:int = -2;
switch (myValue2)
{
    case -3: trace(myValue2 + " == -3"); break;
    case -2: trace(myValue2 + " == -2"); break;
    case -1: trace(myValue2 + " == -1"); break;
    case 0:  trace(myValue2 + " == 0"); break;
    case 1:  trace(myValue2 + " == 1"); break;
    case 2:  trace(myValue2 + " == 2"); break;
    case 3:  trace(myValue2 + " == 3"); break;
    default: trace(myValue2 + " is unknown"); break;
}

次の出力が得られます。

2 == 0
-2 は不明

(Flash Builder 4.7.0.349722 でコンパイル、Flash 11.5.502.149 で実行。Windows 7 SP1、Firefox 18.0.2 で実行)

次の変更はすべて上記の問題を修正し、正しい出力を提供します。

  • 値のタイプを に変更しますNumber
  • 負数のcaseステートメントを削除します。
  • case使用するステートメントを変更するint-リテラルではなく変数... それらの変数もである場合を除き、その場合は壊れたままです!const

変更すると、同じように wtf っぽいmyValue2 = -1出力が得られます。-1 == -3


これは明らかにバグですが、何が原因でしょうか? int 私が理解していないケースステートメントで使用または負の数の微妙なニュアンスはありますか? 私のコードは何か間違っていますか?それとも、単に Flash Builder のバイトコード コンパイラの問題なのでしょうか?

4

3 に答える 3

1

元の値を文字列に変換し、ケースを文字列値にすることで、おそらくコンパイラの手を強制することができます。

switch( String(value) )
{
   case "-3": /*do something*/; break;
   case "-2": /*do something*/; break;
   case "-1": /*do something*/; break;
   case  "0": /*do something*/; break;
   case  "1": /*do something*/; break;
   case  "2": /*do something*/; break;
   case  "3": /*do something*/; break;
   default: break;
}
于 2013-02-14T22:25:18.137 に答える
1

これは、単に Flash Builder のバイトコード コンパイラの問題です。

明らかに、あなたの構文は問題ありません。コンパイラには、2005 年にさかのぼる文字通り何百もの既知の問題があり、まだ解決されていないか未解決です。

于 2013-02-17T21:52:33.047 に答える
1

この質問に対する具体的な答えは見つからないと思います。私が提供できるのは、AS3 コンパイラのバグの確認です。同様の「魔法の」エラーを解決しようとしてかなりの時間を費やしましたが、空になりました。そのような例の 1 つは、Foreach ループが正常に機能している間に、明確な理由もなく配列内の最初または最後の項目をスキップする For および While ループです。

私にとって最ももっともらしい理由は、メモリ管理のエラーです。また、ハードウェアに関連している可能性もあります。これは、私や同僚が使用していた一部のマシンでこのようなことが発生する頻度が高かったためです。私が思うのは、実行された操作の順序など、いくつかの「見えない」条件が満たされているということです(「メモリをジョグする」ために、var宣言とスイッチの間にダミーコードを挿入するか、var値をさらに数回割り当てることができます) )エラーが発生しやすいコンパイラと組み合わせてメモリのアドレス指定を台無しにし、実際にはメモリとは異なる値を取得しながら、スイッチは2つの整数を比較していると考えます。

于 2013-02-13T14:22:47.163 に答える