Flash Actionscript 3 Bug?在开关/案例中使用int和负数

Blu*_*eft 20 debugging flash actionscript actionscript-3 flash-builder

运行此代码

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;
}
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

2 == 0
-2 is unknown

(在Flash Builder 4.7.0.349722中编译,在Flash 11.5.502.149上运行.在Windows 7 SP1中运行,Firefox 18.0.2)

以下更改都解决了上述问题,提供了正确的输出:

  • 将值类型更改为Number.
  • 删除负数字case语句.
  • 更改case要使用的语句int- 变量而不是文字 ...除非这些变量也是const,在这种情况下它会保持不变!

改变myValue2 = -1给出了输出-1 == -3,这同样是wtf-ish.


显然这是一个错误,但......是什么导致它?int 在我不理解的案例陈述中是否存在使用或否定数字的微妙细微差别?我的代码有点错吗?或者这只是Flash Builder中字节码编译器的问题?

小智 1

我认为您不会找到这个问题的具体答案。我可以提供的是 AS3 编译器错误的确认。我花了相当多的时间试图解决类似的“神奇”错误,但一无所获。一个这样的例子是 For 和 While 循环无缘无故地跳过数组中的第一个或最后一个项目,而 Foreach 循环则工作得很好。

对我来说,最合理的原因是内存管理中的错误。它也可能与硬件有关,因为在我或我的同事使用的某些机器上发生此类事情的频率更高。我认为满足了一些“不可见”条件,例如执行操作的顺序(您可以尝试在 var 声明和开关之间放置一些虚拟代码,或者可能多次分配 var 值,只是为了“移动内存” )与容易出错的编译器相结合,会弄乱内存寻址,并且您的交换机认为它正在计算两个整数,而实际上它从内存中获得了不同的值。