gapkiller 发表于 2020-10-10 14:48:27

关于数组下标调用函数的奇怪问题,百思不得其解...[已解决]

本帖最后由 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

shqf 发表于 2020-10-13 12:31:32

$aTest=$aTest + 1执行时,先计算右边的值(Test()会运行1 次),再将值赋给左边数组元素,但左边的数组元素是哪个?还要再执行 一次Test()才能确定,故每一次计数Test()会运行2次。

zch11230 发表于 2020-10-10 16:12:02

$aTest += 1就是$aTest=$aTest + 1
是执行了两次噻。

gapkiller 发表于 2020-10-10 15:25:28

但如果改为如下代码,就没问题了
#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:01:07

本帖最后由 gapkiller 于 2020-10-10 17:03 编辑

zch11230 发表于 2020-10-10 16:12
$aTest += 1就是$aTest=$aTest + 1
是执行了两次噻。这样吗? 感觉还是很奇怪...照理应该先执行Test(),再代入+=1
:face (17):

floor6ggg 发表于 2020-10-10 18:55:15

学习了,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

gapkiller 发表于 2020-10-13 13:08:16

shqf 发表于 2020-10-13 12:31
$aTest=$aTest + 1执行时,先计算右边的值(Test()会运行1 次),再将值赋给左边数组 ...

如果是这样的话, $aTest三个数之和就不会等于100, 可结果确实是100

gapkiller 发表于 2020-10-13 13:16:22

gapkiller 发表于 2020-10-13 13:08
如果是这样的话, $aTest三个数之和就不会等于100, 可结果确实是100

可怕的是, 我把$aTest += 1 改为 $aTest = $aTest + 1后, $iCall变成300了....

afan 发表于 2020-10-13 13:55:08

数组赋值,下标嵌套函数就会被调用两次,以后可得注意不能这样用了,效率降低一半
Global $aTest
$aTest = 0

Func Test()
        MsgBox(0, 0, 0)
EndFunc   ;==>Test

gapkiller 发表于 2020-10-13 15:40:23

afan 发表于 2020-10-13 13:55
数组赋值,下标嵌套函数就会被调用两次,以后可得注意不能这样用了,效率降低一半

感觉是个bug, 有些奇怪.

afan 发表于 2020-10-13 16:38:46

gapkiller 发表于 2020-10-13 15:40
感觉是个bug, 有些奇怪.

同感~ 不过我一般是不会这样用,最多内嵌 UBound()

gapkiller 发表于 2020-10-14 12:57:23

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)

afan 发表于 2020-10-14 13:11:37

gapkiller 发表于 2020-10-14 12:57
搞不好UBound()也被执行了两次, 我做了个实验, 先把Ubound($aArr)赋值给一个临时变量, 再带入下标计算,...

肯定是一样执行两次,只是因为这个几乎忽略不计而已。如果在循环体中肯定不会这样做

gapkiller 发表于 2020-10-14 13:55:35

afan 发表于 2020-10-14 13:11
肯定是一样执行两次,只是因为这个几乎忽略不计而已。如果在循环体中肯定不会这样做

怎么把标签改为与解决的??找不到这个标签了...

afan 发表于 2020-10-14 14:52:26

gapkiller 发表于 2020-10-14 13:55
怎么把标签改为与解决的??找不到这个标签了...

没有这个分类,都是加几个字就行了
页: [1]
查看完整版本: 关于数组下标调用函数的奇怪问题,百思不得其解...[已解决]