int x;
int main() {
x = 14;
f();
g();
}
void f() {
int x = 13;
h();
}
void g() {
int x = 12;
h();
}
void h() {
printf("%d\n",x);
}
如果使用静态范围,结果是什么?如果使用动态范围,结果是什么?
现在,如果我理解正确的范围,静态和动态范围之间的区别在于静态使变量本地化为类。因此,值x
将是void f()
,void g()
和int main ()
的本地值,动态会使它们全局可用。我只是不确定如何将它应用于此代码。如果使用静态作用域,它只打印最后一个值(来自void g()
的12),动态作用域将使用x
的所有值吗?
我对范围确实如何运作有点困惑。我知道C
使用了静态作用域。
答案 0 :(得分:41)
静态作用域意味着x
引用x
声明的最内层声明范围,其中包含一个。由于h
是在全局范围内声明的,因此最里面的x
是全局范围内的x
(它无法访问f
中的g
和{{1}因为它没有在它们中声明,所以程序打印14
两次。
动态范围表示x
指的是在最近的框架中声明的x
,其中有一个<{strong>。如果C使用动态作用域,h
将使用x
或f
中的g
- 无论哪个调用它 - 所以程序将打印13
并且12
。
答案 1 :(得分:13)
C / C ++不使用动态范围。您的编程语言将使用其中一种,您无法选择(除非您使用Clojure!根据下面的Idan Arye)。
这是一个很好的解释/比较一个很好的例子: http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/
答案 2 :(得分:4)
请考虑以下代码段
int x=10;
此处,值10存储在内存中的特定位置,名称为“&#39; x&#39;被绑定到那个位置
范围是该绑定有效的程序的一部分。简单来说,变量可见的程序部分
该计划的第34部分&#34;可以引用代码(静态范围)的特定部分或运行时(动态范围)的一部分,此绑定有效。
在这种情况下
int x; //X1
int main() {
x = 14;
f();
g();
}
void f() {
int x = 13; //X2
h();
}
void g() {
int x = 12; //X3
h();
}
void h() {
printf("%d\n",x);
}
可以在程序中的任何位置访问X1。因此在main()X1中赋值为14
调用f()时,会创建一个新变量(存储在新的内存位置) &#39; x(#2)(x2)本地到f() 并且初始化值13并且当调用g()时,类似于另一个新变量 &#39; x&#39;(X3)本地到g() ,值为12创建。
静态范围
当f()或g()调用h()时,X2和X3分别在f()和g()之外不可见(代码部分),而X1是全局可见的,因此输出将是是
14
14
动态范围 当f()执行名称&#39; x&#39;绑定到X2并且当f()调用h()时,函数f()仍在执行,名称&#39; x&#39;仍然绑定到X2,因此本地X2将打印到输出。执行f()后,此绑定不存在(运行时的一部分)和&#39; x&#39;绑定到X1。当g()执行时,名称&#39; x&#39;被绑定到X3。当调用h()时,f()仍在运行,名称为&#39; x&#39;仍然绑定到X3,因此将打印本地X3并输出
13
12
答案 3 :(得分:2)
在静态作用域中,标识符的作用域由其在代码中的位置决定,并且由于这不会改变,因此作用域也不会。在动态作用域中,作用域由导致使用标识符的调用序列决定,并且由于每次达到使用时它可能不同,因此是动态的。
在您的示例中,在静态作用域下,无论h如何被调用,h中的x将始终为全局x。但是对于动态范围,它将引用在f中声明的x或在g中声明的x,具体取决于在特定时间内调用h。
答案 4 :(得分:0)
这是完全证明的ans 在
静态范围:一旦为全局变量赋值,它的范围将在整个程序执行期间存在。
因此,答案是:14
和14
。因为C语言拥有静态作用域,你可以在TURBO-C编译器中检查它。
当你来到
时 动态范围:无论全局变量的值如何。都会考虑块中指定的值。
因此答案是:f()=13
和g()=12
答案 5 :(得分:0)
静态范围:静态范围是指在编译时定义的变量范围。它总是指具有顶级环境的变量 在这个程序中,静态范围的结果是14和14,因为f()和g()总是返回全局变量x的值。 f()和g()不依赖于谁调用它们。
动态范围:动态范围是指在运行时定义的变量的范围。它指的是具有最新环境的标识符。它类似于动态编程,因为在dp中值会更新 在这个程序中,动态范围的结果是13和12,因为f()和g()返回当前变量x值而不是全局变量。