回 帖 发 新 帖 刷新版面

主题:关于一个foxpro程序的问题,结果想不通

源码如下:
*eez:
a1=10
a2=20
a3=30
do ee1
?"a1=",a1
?"a2=",a2
?"a3=",a3
do ee2 with a3,a1+a2
?"a1=",a1   &&这个的结果为啥是10
?"a2=",a2   &&这个的结果为啥是20
?"a3=",a3   &&这个的结果为啥是51
return


*ee1
private a1,a2
a1=41
a2=42
a3=43
return


*ee2
para a1,a2
?"a1,a2=",a1,a2
a1=51
a2=52
a3=53
do ee1
?"a1,a2,a3=",a1,a2,a3
return

问题在题目中

回复列表 (共7个回复)

沙发

这你面牵扯局部变量和全局变量的问题已及实参和形参的问题,中间环节我能知道,但最后的结果却不明白

板凳

哪位高人能帮忙解答一下,斑竹呢,帮帮我吧

3 楼

首先修改一下源程序,加入测试代码 display memo 命令:
*eez:
a1=10
a2=20
a3=30
?" show No.1 *******************************************"
DISPLAY MEMORY LIKE  a*  && No.1
do ee1
?"a1=",a1
?"a2=",a2
?"a3=",a3
?" show No.2 ***********************************************"
DISPLAY MEMORY LIKE  a*  && No.2
do ee2 with a3,a1+a2
?"a1=",a1   &&这个的结果为啥是10
?"a2=",a2   &&这个的结果为啥是20
?"a3=",a3   &&这个的结果为啥是51
return

FUNCTION ee1
private a1,a2
a1=41
a2=42
a3=43
?" show No.3 *********************************************"
DISPLAY MEMORY LIKE  a*    && No.3
return
ENDFUNC

FUNCTION ee2
para a1,a2
?"a1,a2=",a1,a2
a1=51
a2=52
a3=53
?" show No.4 ***********************************************"
DISPLAY MEMORY LIKE  a*   && No.4
do ee1
?"a1,a2,a3=",a1,a2,a3
return
ENDFUNC 

4 楼

在VFP中运行上程序,可以看到运行的结果,

No1. 显示出 a1,a2,a3, 所有新生成的变量,默认私有属性 Priv

第一个No3. 显示出 主程序的a1,a2,a3 仍然存在,并可以被子程序直接使用,因此 a3 被改动. 子程序中的 a1, a2 是独立的新增变量, 主程序中同名的 a1,a2 已被自动隐藏,属性变为: Hid .

No2. 显示出 子程序1 中的变量 a1,a2 在执行完子程序后,已经被释放,内存中已经不存在. 所以只有 主程序中的3 个变量 a1,a2,a3, 程序中 ? 命令显示的也是这三个变量 .

No4. 显示出 子程序中的 a1 是由 a3 进行变量传递而得到,因此,a1 是a3 的一个变量引用,a1 的属性就是 a3, 也就是说指向内存中同一个地址,a1 的改变也同时改变了主程序中的 a3 . 子程序2中 a3= 53 实际的行为是新增了一个变量,(与子程序1不同的原因,可能是因为a3在参数调用中使用过) 因此,主程序中的 a3 因为同名而被隐藏.

第二个No3. 显示出 主程序中的a1,a2,a3仍然被隐藏着,子程序2中的a1,a2 也被隐藏,子程序中1的 a3 此时代表的是调用这个程序的上一层程序中的变量,也就是 子程序2中的 a3, 它的改变导致 子程序2 中的 a3 值发生改变.

执行完 ee2 以后,所有子程序中的变量被释放, 主程序中的 a1,a2 由隐藏变为正常, 其中的值一直未变动,所以 仍旧是 10 和20, a3 在第一次调用 ee1时被改变为 43, 做为参数传递给 ee2 后,被改动为 51.

结论:
1. 上一层程序的变量,可以被一下层变量直接使用.

2. 变量做为参数传递给下一层程序时,下一层程序实现的是对变量引用,因此,将直接改变变量的值.

3. 上一层变量作为参数使用后, 下一层同名的变量将作为新增变量独立使用.

4. 下一层程序执行完成后, 其中的私有变量将被释放, 对变量的引用也将消失,但被引用的变量不会消失.

5. 下层程序出现于上层程序同名的新增变量后, 上一层中的同名变量将被隐藏, 其值不会改变.

5 楼

建议在程序中多使用 disp memo 命令,可以看到变量所属的程序名称,及其它信息,用于对变量作出判断.

上面的程序中,因为主程序的 a1,a2 在调用子程序的过程中,一直被隐藏,其值一直没有发生改变, 所以最终的结果还是 10 和 20 .

6 楼

非常感谢!

7 楼

private 所设置变量为静态变量,作用域不同,建议你再想想Ok!
  欢迎与我联系我的邮箱是xtanfhvklang@163.com

我来回复

您尚未登录,请登录后再回复。点此登录或注册