skyfree 发表于 2011-12-7 11:10:33

【BUG反馈】循环内变量重新定义无效?这个算不算AU3的BUG?

本帖最后由 skyfree 于 2011-12-7 11:12 编辑


_Main()
Exit

Func _Main()
        Local $i
        For $i = 1 To 2
                Local $s_Test
                MsgBox(0, $i & "-1", $s_Test)
                $s_Test = "Test"
                MsgBox(0, $i & "-2", $s_Test)
        Next
EndFunc   ;==>_Main


写了段简单的代码用以说明问题,上述代码没有实际功能,简单解释一下:
1、使用For循环循环两次
2、循环中,每次都定义变量“$s_Test”
3、定义完变量后,显示变量的初值,对AU3来说变量不定义初值时值应为空
4、而后将$s_Test赋值为“Test”
5、再次展示$s_Test的值,此时值即为“Test”

但发现了如下问题:
1、循环体被执行了两次,两次中每次都有定义变量$s_Test
2、理论上说,第一次定义的$s_Test与第二次定义的$s_Test应该只是名称相同,但不是同一个变量,具体说,应不是同一个内存数据块
3、理论上说,两次循环中所展示出的$s_Test值应是相同的,应是先为空,后为“Test”
4、但问题出现了:
(1)第一次循环中,$s_Test的值先为空,

后为“Test”

这个没错
(2)但在第二次循环中,$s_Test的值竟然先为“Test”?!

后还是“Test”

第二次循环中,$s_Test的值应与第一次循环时相同,还是先为空,后为“Test”才对吧??

afan 发表于 2011-12-7 11:25:39

这个应该是Au既定的,不是Bug~
类似这种重定义的情况我肯定会赋初值 Local $s_Test = ''

3mile 发表于 2011-12-7 11:29:17

bdancerlc 发表于 2011-12-7 12:42:58

前辈的$s_Test在第二次循环开始没有赋新值,
Local说明应该是在这个函数内部有效,而第二次循环仍然属于此作用域内!...

小弟愚见...

netegg 发表于 2011-12-7 13:05:13

内存是不会自动释放的,local那个内存就是私有的,一旦发生赋值,除非改值,否则不会变的

user3000 发表于 2011-12-7 16:41:42

学习了!
两位元老道出了前因后果!

skyfree 发表于 2011-12-7 17:27:08

看来以后变量必须要赋初值了

happytc 发表于 2011-12-7 19:52:53

回复 1# skyfree

这不是bug,在那个语言里基本都差不多,首先要明白啥是变量定义:所谓定义,就是编译器创建一个对象,并为这个变量分配一块内存和取个名字,这个名字就是常说的变量名了。但注意的是,一旦这个名字跟一定的内存块匹配起来了,在一定的作用空间(名空间:如函数内,全局变量等),就只能被定义一次,若多次重复定义,语言编译器有两种处理方式,如标准C的编译器直接报错,而一些所谓优化的C语言编译器会直接忽略后面的重复定义(不报错),au3采取的是后者形式,也就是直接忽略重复定义
总结下就是:对类型和名字完全相同的定义,编译器直接忽略第二次定义,但不忽略第二次初始化(因为初始化其实是两个步骤:先定义,然后赋值,若编译器发现已经定义过了,就直接到第二步赋值了)。

还有一点就是跟你所说的循环还没有关系,因为一个循环不是一个名空间(au3里的for循环中,只有且仅有循环变量$i会自动创建为Local名空间的,所以for循环里的循环变量$i可以不用定义的)

hzxymkb 发表于 2011-12-8 09:41:28

有很多的语言定义变量的时候必须赋值的,有的语言不赋值的情况下默认是1
高人一出马,必定会引来众多的高手!
页: [1]
查看完整版本: 【BUG反馈】循环内变量重新定义无效?这个算不算AU3的BUG?