我的朋友在Facebook上发布了这个问题,我不知道它是怎么发生的。
考虑以下代码:
var num:Array = new Array();
var i:int, sum:int = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++) num[Math.floor(Math.random()*100)] += 1;
for(i=0; i<100; i++) sum += num[i];
trace(sum);
它总和应为100,但每次运行时会打印不同的数字,有时sum
会大于100.(即使sum
的类型为Number
或{{ 1}},*
更改为其他一些数字,例如1
;结果不接近0.1
- 某些不是,如10.0
}。)
同时,这些代码工作正常。
9.9999993
和
var num:Array = new Array();
var i:int, sum:int = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++) num[Math.floor(Math.random()*100)]++;
for(i=0; i<100; i++) sum += num[i];
trace(sum);
所有时间都正确打印100个。
另外,JavaScript中的这段代码可以正常工作
var num:Array = new Array();
var i:int, sum:int = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++){
var tmp:Number = Math.floor(Math.random()*100);
num[tmp] += 1;
}
for(i=0; i<100; i++) sum += num[i];
trace(sum);
虽然var num = new Array();
var i, sum = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++) num[Math.floor(Math.random()*100)] += 1;
for(i=0; i<100; i++) sum += num[i];
console.log(sum);
刚刚更改为console.log
并且作为AS2或AS3代码运行时不是。是什么导致了这种行为?
(使用了Adobe Flash CS6,似乎无论哪个Flash Player被定位(安装版本是12.0.0.38)以及是否使用AS2或AS3;甚至“AIR 3.2 for Desktop”的行为也相同。)
答案 0 :(得分:-1)
Facebook上的其他人刚评论了我朋友的帖子:
function foo():int {
trace("foo()");
return 0;
}
var arr:Array = new Array();
trace("bar");
arr[foo()] = 0;
trace("bar");
arr[foo()] += 10;
打印
bar
foo()
bar
foo()
foo()
,表明在评估a += b
时,a
会被评估两次。