关于变量作用域的几个疑问
1.其他语言会有一个main函数,main函数之外定义的是全局变量,autoit没有main函数,是不是函数之外的变量就是全局变量?2.如果是,那么函数之外的dim、local、global,有什么区别?在函数之外的dim、local是否也是全局变量?
3.其他语言全局变量和局部变量作用域重合的时候,起作用的是局部变量,autoit是否也是这种情况(测试结果为是)?这个问题的原因是,帮助上说,“Dim = 如果同名的全局变量不存在,则作用域为局部(如果已有同名的全局变量存在则将复用该变量!)”,这句话我没看明白到底是个啥意思。
4.“在同一作用域内以一个简单的值声明一个变量,不会修改变量的值”,帮助里的这句话是什么意思?
5.autoit函数形参是不是值传递?
6.“如果你声明一个与参数同名的变量, 当函数内部使用 Local 时将出现错误”,这句话是什么意思?
非常感谢,让各位大牛见笑了,呵呵。
帮助说应该少用dim,我感觉是这样,感觉没把dim完全吃透。 1.你所写的代码就是MAIN 也就是说这不需要写 MAIN
2.帮助里面有详细说明(帮助里面收其中的一个就可以看到)
3.建议尽量使用 其它两个申明,一个全局,一个局部。这样比较易读易写易修改。
DIM 自己没用过。。
4.这个意思就是说你申明的是一个常量,不可以修改的量
常量 Const $a = 2
$a = 2(不能执行)
变量dim、local、global(其中一个) $a = 3
$a =5 (可以执行)
5.形参 是什么我不知道 但是函数可以有参数,返回值
6.这个也不知道,不要使用同名变量就是了 比如:$a,$a1,$a2......这样就避免同名了 没有同名也就没有后面的那么多了
PS:以上仅 小弟个人愚见 还请前辈们指正{:face (396):} 1.其他语言会有一个main函数,main函数之外定义的是全局变量,autoit没有main函数,是不是函数之外的变量就是全局变量?
/*可以这么认为,函数之外声明的变量都能被其他函数访问,无论 local 或者 global。*/
2.如果是,那么函数之外的dim、local、global,有什么区别?在函数之外的dim、local是否也是全局变量?
/*函数之外,dim可以声明成不确定的有效范围,有可能是 local 也有可能是 global,这个视函数的作用域.*/
3.其他语言全局变量和局部变量作用域重合的时候,起作用的是局部变量,autoit是否也是这种情况(测试结果为是)?这个问题的原因是,帮助上说,“Dim = 如果同名的全局变量不存在,则作用域为局部(如果已有同名的全局变量存在则将复用该变量!)”,这句话我没看明白到底是个啥意思。
/*在全局变量和局部变量重合是,局部变量优先。dim上面说过,他是不确定的声明类型,视作用范围可以声明成local或者 global
上面这句,如果没用同名的全局变量,那么这个dim将声明成局部变量,如果有全局的变量,那么dim声明的变量也作为局部变量,只是名字相同了*/
4.“在同一作用域内以一个简单的值声明一个变量,不会修改变量的值”,帮助里的这句话是什么意思?
/*这句的意思就是用一个常量声明一个变量,常量不是会改变的。*/
5.autoit函数形参是不是值传递?
/*autoit参考的是C语言,形参也是值传递的,用了那么久不知道怎么传址,当然我只是菜鸟阶段*/
6.“如果你声明一个与参数同名的变量, 当函数内部使用 Local 时将出现错误”,这句话是什么意思?
/*函数的形参是一个局部变量,如果函数范围内用local将重复声明一个局部变量.*/
非常感谢,让各位大牛见笑了,呵呵。
帮助说应该少用dim,我感觉是这样,感觉没把dim完全吃透。 回复 1# zcsgamer
楼上已经有不少好回答, 我根据自己体验补充一点:
有关第3个问题, 实例体会吧:Dim $n = 5
_myfunc()
MsgBox(0, 'main', $n)
Func _myfunc()
Dim $n ; 这里没有赋值, 沿用了全局变量...
$n += 1
MsgBox(0, 'myfunc', $n)
EndFunc问题5: 请参考 ByRef 的帮助信息
问题6: 其错误类似于Dim $n = 5
_myfunc($n)
Func _myfunc($n)
local $n ; 这里将出错...
;....
EndFunc 感谢楼上几位的经验分享,我捣鼓了一下,发觉问题多多,比如,为什么这个测试程序会出错呢??
_test()
MsgBox(0,'外面的',$a)
Func _test()
Global $a=1
$a+=666666666666
MsgBox(0,'来自自定义函数内',$a)
EndFunc
按理说,自定义函数内部已经将变量$a强制转成全局的,为什么在外面无法引用??
"E:\桌面\code\au3.au3"(35,21) : warning: $a: 使用前并未进行声明.
MsgBox(0,'外面的',$a)
~~~~~~~~~~~~~~~~~~~~^
E:\桌面\code\au3.au3 - 0 错误, 1 警告
istics;
但将,自定义函数的位置和外面的信息框位置换一下就可以了~~,郁闷~~ 回复 5# annybaby
AU3程序的编译与执行是按顺序进行的, 这就是出错与" 自定义函数的位置和外面的信息框位置换一下就可以了" 的原因 回复 6# user3000
你前部分说的明显是事实,但实话说,我很难同意你这个观点(因为它没有解释:为什么会报错)
更多的测试表明,事实是:程序是可完全正确地执行,数据也是正确的,只是检查的程序是从顺序检查的,所以在检查时报错了~~继续执行没有问题~~ 回复 7# annybaby
你的那段代码我这里可以正常运行,没报错。 感谢各位大牛,明白了不少,但还有两个问题:
1.函数外部的global与local是否完全一样,还是有什么区别?
2.dim这种声明方式有何不可替代之处,既然有global和local了,autoit为什么还要有dim存在? 回复 7# annybaby
好吧, 我话说得不够详细. 你程序本身实质上是没问题, 但 au3check 的检查工作是按代码一行一行进行的, 比如你那个小程序:
第一行_test() , 它就会检查是否程序中已经定义有这样的一个函数, 但此时还不会检查此函数的语法详细情况!
第二行, 它接着检查MsgBox(0,'外面的',$a), 它就会认为变量a没有定义过, 于是给出了报错提示, 并停止工作~! 尽管你在后面的函数中是有相关定义, 但它明显没那么智能地知道去检查后面的代码, 或者说作者未赋予它此智能?此问题, 在论坛上已有相关讨论的帖子, 但我记性差, 这里就无法具体的例出... 本帖最后由 xms77 于 2012-9-23 22:44 编辑
回复 9# zcsgamer
5.autoit函数形参是不是值传递?
传址:
func _xxx(ByRef $a)
...
endfunc
传值:
func _xxx($a)
...
endfunc 回复 7# annybaby
报错的,没有声明的变量(以编译的角度为准)使用就会报错
有图有真相: 回复 12# 魔导
程序是没有错的,这个报错我前面已经说了(其实你前面也已经有说{:face (396):})
请注意看这个图的标题:
au3check
是检查,你不管它,直接运行可以,编译后运行也可以~~
所以说,程序"本身"没有错,只是检查器"以为"它错了,因为还不够智能~~{:face (197):} 回复 11# xms77
这个跟9#的问题有什么关系吗?
话说我一直也有类似疑问。总觉得local和global在函数外是等同的。
即使多文件的情况,local定义的变量也能在其他文件中使用。因为include是会展开的,展开后相当于在一个文件内。 回复 14# xiehuahere
这个跟9#的确没有啥关系,只是我和魔导进行一些有益的探讨~{:face (427):}
在一个程序里,global和local在函数外是一样的(或者说,我个人没有发现显著区别),这只是因为没有办法跟到这个程序的"更外面",但是当你将一个程序作为一个UDF使用时,这个原来在"函数外面定义"的变量就会变成了主程序里的一个自定义函数"里面的变量"就显然会有区别了~~
页:
[1]
2