我和我的朋友在理解静态和动态范围方面遇到了一些麻烦。我相信动态,变量(全局)将继续被其他函数更新,直到打印,而对于静态,我认为任何值被赋予变量的第一个就是这样。
这种想法是正确还是没有?
有关使用上述想法的示例,我已从此代码段计算了以下内容。
int a, b, c;
void p() {
int a = 3;
b = 1;
c = a + b;
q();
}
void print() { printf(“%d %d %d\n”, a, b, c); }
void q() {
int b = 4;
a = 5;
c = a + b;
print();
}
main() {
int c = 5;
p();
}
Output with static scoping: 315
Output with dynamic scoping: 549
答案 0 :(得分:1)
使用静态作用域时,print
会失败,因为a
,b
和c
都未在print
内或{{}}范围内分配值{1}} 已定义(即文件的第一行)。
使用动态作用域,输出将为549,因为print
,a
和b
中的每一个都在c
中分配了值。您的代码未证明的事实是q
在q
内的调用返回后, local 变量p
在{{中设置了值5 1}},而不是全局变量。即,发生以下情况:
声明了全局变量a
,q
和a
,但没有值。我们假设您的语言将这些值初始化为0。
b
被调用。 c
本地变量main
的值为c
;全局main
仍然等于0.
5
被调用。 c
- 局部变量p
的值为3;全局p
仍为0。
a
或其来电者a
中不存在本地变量b
,因此全局p
设置为1。
main
中不存在局部变量b
,但c
中存在局部变量,其值设置为3 + 1 = 4.
p
被调用。声明了本地c
并将其设置为4,将全局q
设置为0.
b
中不存在本地变量b
,但其调用者a
中有一个,因此该值从3更改为5.
q
或其来电者p
中不存在本地变量c
,但q
来电者p
中存在,因此该值设置为5 + 4 = 9.全局p
仍为0.
main
被调用,缺少任何本地c
,print
或a
,它会在其调用链中回顾。它使用b
中的c
,a
中的p
和b
中的q
(不使用全局变量。
c
返回。在main
中,q
和p
的值仍然是a
中设置的5和9。 c
仍为1,因为q
宣布为本地b
。
q
返回。在b
,我们仍然有p
(因为main
在调用a=0
之前声明了自己的副本),p
(因为q
修改了全局b=1
)和p
(因为b
最终将变量本地修改为c=9
)。
q
返回。我们仍有全球c
,main
和a=0
。
如果这让人感到困惑(我并没有让自己迷惑并犯下任何错误),你可能会理解为什么大多数语言使用静态作用域:它不仅更容易,而且可能更容易关于程序行为的原因,而不必运行或模拟它只是为了跟踪变量赋值。
答案 1 :(得分:0)
static scoping- 5 1 9 //它将全局值作为未在print函数中定义的变量
动态范围 - 5 4 9