回 帖 发 新 帖 刷新版面

主题:变量作用域重新定义

&&main.prg
public x,y
set proc to kk
x=20
y=50
do a1
?x,y
set proc to
return
*过程序文件kk.prg
proc a1
private x
x=30
local y
do a2
?x,y
return
proc a2
x="kkk"
y="mmm"
return

1、第一次显示x,y的值是()
A、kkk  30   B、kkk  .F.  C、kkk  50  D、30   .F.
2、第二次显示x,y的值是()
A、20  50   B、20   mmm   C、30  50   D、30  mmm
第二题答案怎么是B呢?

回复列表 (共6个回复)

沙发

经我分析,总结如下:
public,公共变量,作用于整个程域,而不管这量在什么地方定义(在主程序中或子程序中或子程的子程中都可以)
private,私有变量,作用于变量所在的程序或子程序以及它所调用的子程序中
local,为本地类型变量,作用于定义变量的所在的程序中,其外部,以及该程序调用的子程中不受它的影响。

所以子程a1中的x是私有变量,它影响的范围是子程a1及其所调用的子程a2,其外部的主程序不受它影响。因此在主程序中调用的x=20(第二次显示)

子程a1中的y是本地变量,子程a2中的y不受其影响,但a2中的y没有重新定义类型,理应是主程中定义的y,所以在主程序从a1中返回后显示出来的y值应是在子程a2中改变了的y值,所以是‘mmm’

板凳

proc a1中的private x,屏蔽了全局变量x,作用域到达proc 1的return,对于a2可见。在main中调用a1结束后,public x重见光明,所以显示20.可以用Debugger调试跟踪一下,就明白了。

3 楼

还有一个问题,就是为什么私有变量不能重新定义为全局变量,而局部变量却可以重新定义为公共变量?

4 楼


还有一个问题,就是为什么私有变量不能重新定义为全局变量,而局部变量却可以重新定义为公共变量?

5 楼

注意到你提到两个概念,一个是全局变量,一个是公共变量,有区别吗?
不过你的问题还是相当地不好回答。

6 楼

[quote]
还有一个问题,就是为什么私有变量不能重新定义为全局变量,而局部变量却可以重新定义为公共变量?[/quote]
所谓重新定义是在子程中进行的事情,因为私有变量的作用域延伸到了子程里面,所以不能重定义为全局变量,但局部变量或称本地变量则不然,它们的作用域延伸不到调用它们的父程序中也延伸不到它们所在程序块所调用的子程序中,所以在子程中可以重新定义为公共变量.注意在它们所在程序中的它们,和子程序中重新定义的它们,并不是同一变量,而是名称相同的不同变量.

我来回复

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