动态和静态作用域程序的差异

时间:2013-10-19 01:57:04

标签: c++ scope

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使用了静态作用域。

6 个答案:

答案 0 :(得分:41)

静态作用域意味着x引用x声明的最内层声明范围,其中包含一个。由于h是在全局范围内声明的,因此最里面的x是全局范围内的x(它无法访问f中的g和{{1}因为它没有在它们中声明,所以程序打印14两次。

动态范围表示x指的是在最近的框架中声明的x,其中有一个<{strong>。如果C使用动态作用域,h将使用xf中的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 在

静态范围:一旦为全局变量赋值,它的范围将在整个程序执行期间存在。 因此,答案是:1414。因为C语言拥有静态作用域,你可以在TURBO-C编译器中检查它。

当你来到

动态范围:无论全局变量的值如何。都会考虑块中指定的值。 因此答案是:f()=13g()=12

答案 5 :(得分:0)

静态范围:静态范围是指在编译时定义的变量范围。它总是指具有顶级环境的变量 在这个程序中,静态范围的结果是14和14,因为f()和g()总是返回全局变量x的值。 f()和g()不依赖于谁调用它们。

动态范围:动态范围是指在运行时定义的变量的范围。它指的是具有最新环境的标识符。它类似于动态编程,因为在dp中值会更新 在这个程序中,动态范围的结果是13和12,因为f()和g()返回当前变量x值而不是全局变量。

参考:GeeksforGeeks