关于数组下标调用函数的奇怪问题,百思不得其解...[已解决]
本帖最后由 gapkiller 于 2020-10-14 15:08 编辑为何Test()被调用了200次?
#include <Array.au3>
Global $aTest=
Global $iCall = 0
For $i=1 To 100
$aTest += 1
Next
_ArrayDisplay($aTest, $iCall)
Func Test()
$iCall += 1
Return Random(0,2,1)
EndFunc $aTest=$aTest + 1执行时,先计算右边的值(Test()会运行1 次),再将值赋给左边数组元素,但左边的数组元素是哪个?还要再执行 一次Test()才能确定,故每一次计数Test()会运行2次。 $aTest += 1就是$aTest=$aTest + 1
是执行了两次噻。 但如果改为如下代码,就没问题了
#include <Array.au3>
Global $aTest=
Global $iCall = 0
For $i=1 To 100
$iTemp = Test()
$aTest[$iTemp] += 1
Next
_ArrayDisplay($aTest, $iCall)
Func Test()
$iCall += 1
Return Random(0,2,1)
EndFunc
:face (22): 本帖最后由 gapkiller 于 2020-10-10 17:03 编辑
zch11230 发表于 2020-10-10 16:12
$aTest += 1就是$aTest=$aTest + 1
是执行了两次噻。这样吗? 感觉还是很奇怪...照理应该先执行Test(),再代入+=1
:face (17): 学习了,3楼正解,。。。。。。。。。
加了个调试,控制台。。。可以看到的确是执行了两次
#include <Array.au3>
Global $aTest=
;~ _ArrayDisplay($aTest,'Debug~~~')
Global $iCall = 0
For $i=1 To 100
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i = ' & $i & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$aTest += 1
Next
_ArrayDisplay($aTest, $iCall)
Func Test()
$iCall += 1
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iCall = ' & $iCall & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
Return Random(0,2,1)
;~ Return $iCall
EndFunc shqf 发表于 2020-10-13 12:31
$aTest=$aTest + 1执行时,先计算右边的值(Test()会运行1 次),再将值赋给左边数组 ...
如果是这样的话, $aTest三个数之和就不会等于100, 可结果确实是100 gapkiller 发表于 2020-10-13 13:08
如果是这样的话, $aTest三个数之和就不会等于100, 可结果确实是100
可怕的是, 我把$aTest += 1 改为 $aTest = $aTest + 1后, $iCall变成300了....
数组赋值,下标嵌套函数就会被调用两次,以后可得注意不能这样用了,效率降低一半
Global $aTest
$aTest = 0
Func Test()
MsgBox(0, 0, 0)
EndFunc ;==>Test afan 发表于 2020-10-13 13:55
数组赋值,下标嵌套函数就会被调用两次,以后可得注意不能这样用了,效率降低一半
感觉是个bug, 有些奇怪. gapkiller 发表于 2020-10-13 15:40
感觉是个bug, 有些奇怪.
同感~ 不过我一般是不会这样用,最多内嵌 UBound() afan 发表于 2020-10-13 16:38
同感~ 不过我一般是不会这样用,最多内嵌 UBound()
搞不好UBound()也被执行了两次, 我做了个实验, 先把Ubound($aArr)赋值给一个临时变量, 再带入下标计算, 效率更高....:face (13):
Local $aArr
Local $iTemp
$ti = TimerInit()
For $i = 1 To 1000
$iTemp = UBound($aArr)-1
$aArr[$iTemp] = 100
;~ $aArr = 100
Next
$td = TimerDiff($ti)
MsgBox(0,0,$td) gapkiller 发表于 2020-10-14 12:57
搞不好UBound()也被执行了两次, 我做了个实验, 先把Ubound($aArr)赋值给一个临时变量, 再带入下标计算,...
肯定是一样执行两次,只是因为这个几乎忽略不计而已。如果在循环体中肯定不会这样做 afan 发表于 2020-10-14 13:11
肯定是一样执行两次,只是因为这个几乎忽略不计而已。如果在循环体中肯定不会这样做
怎么把标签改为与解决的??找不到这个标签了... gapkiller 发表于 2020-10-14 13:55
怎么把标签改为与解决的??找不到这个标签了...
没有这个分类,都是加几个字就行了
页:
[1]