所以我有这个问题,我必须使用两个不同的范围规则来计算输出。我知道使用词法作用域的输出是a=3
和b=1
,但是我很难用动态范围来计算输出。
注意:下面的代码示例使用C语法,但我们只是将其视为伪代码。
int a,b;
int p() {
int a, p;
a = 0; b = 1; p = 2;
return p;
}
void print() {
printf("%d\n%d\n",a,b);
}
void q () {
int b;
a = 3; b = 4;
print();
}
main() {
a = p();
q();
}
这是我想出的。
使用动态范围,a
和b
的非本地引用可以更改。所以我有a=2
(从p()返回),然后是b=4
(在q()内)。
所以输出是2 4
?
答案 0 :(得分:6)
正如我们所知,C没有动态范围,但假设确实如此,程序将打印3 4。
在主要方面,a和b是全球性的。 a将被设置为2,因为我们将看到这将是p将返回的。
在p中,从main调用,b仍然是全局的,但是a是p中的本地。本地a设置为0,但很快就会消失。全局b设置为1.本地p设置为2,将返回2。现在全局b是1。
在q中,从main调用,a是全局的,但b是q中的局部。这里全局a设置为3,本地b设置为4.
在打印中,从q调用,a是全局的(值为3),b是q中的局部值(值为4)。
在最后一步,在函数print中,我们看到了与静态作用域的区别。对于静态范围,a和b将是全局的。使用动态范围,我们必须查看调用函数链,在q中我们找到一个变量b,它将是打印内部使用的b。
答案 1 :(得分:3)
C不是动态范围的语言。如果您想进行实验以了解差异,那么您最好使用像Perl这样的语言,让您在两者之间进行选择。