44
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 ()动态将使它们在全球范围内可用。我只是不确定如何将其应用于此代码。如果使用静态范围,它只会打印最后一个值(来自 的 12 void g()),而动态范围将使用 的所有值x

我对范围界定的实际工作方式有点困惑。我知道C虽然使用静态范围。

4

6 回答 6

51

静态作用域是xx声明的最内层声明范围具有一个。由于h是在全局范围内声明的,所以最里面x的是全局范围内的(它无法访问 and 中的s x,因为它没有在其中声明),所以程序打印了两次。fg14

动态范围是x在调用堆栈x的最近一帧中声明的具有一个。如果 C 使用动态范围,将使用from或- 调用它的任何一个 - 所以程序将打印and 。hxfg1312

于 2013-10-19T02:08:45.813 回答
15

C/C++ 不使用动态范围。您的编程语言将使用一种或另一种,您无法选择(除非您使用 Clojure!根据下面的 Idan Arye)。

这是一个很好的解释/比较一个很好的例子: http: //msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/

于 2013-10-19T02:09:10.397 回答
7

考虑以下代码片段

int x=10;    

这里值 10 存储在内存中的特定位置,名称“x”绑定到该位置。
范围是此Binding有效的程序部分。简而言之,变量可见的程序部分。
“程序的一部分”可以指代码的特定部分(静态范围)或运行时的一部分(动态范围),其中此绑定有效。
在这种情况下

   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() 被调用时,一个新的变量(存储在一个新的内存位置)'x'(X2) 局部于 f()被创建并初始化值 13,当g() 被调用,类似地,另一个新变量'x'(X3) 被创建为 g()的局部变量,值为 12。
在静态作用域中
,当 f() 或 g() 调用 h() 时,X2 和 X3 分别在 f() 和 g() 之外不可见(部分代码),而 X1 是全局可见的,因此输出将是

14
14  

在动态作用域中 ,当 f() 执行时,名称 'x' 绑定到 X2 并且当 f() 调用 h() 时,函数 f() 仍在执行并且名称 'x' 仍然绑定到 X2,因此本地 X2将被打印到输出。执行 f() 后,此绑定不存在(运行时的一部分)并且“x”绑定到 X1。并且当 g() 执行时,名称 'x' 绑定到 X3。当调用 h() 时,f() 仍在运行并且名称 'x' 仍然绑定到 X3,因此将打印本地 X3 并输出将是

13
12
于 2014-10-05T14:08:12.420 回答
3

在静态作用域中,标识符的作用域由其在代码中的位置确定,并且由于它不会改变,因此作用域也不会改变。在动态作用域中,作用域由导致使用标识符的调用序列确定,并且由于每次达到使用时都可能不同,因此它是动态的。

在您的示例中,在静态作用域下, h 中的 x 将始终是全局 x,无论 h 是如何被调用的。但是对于动态范围,它将引用在 f 中声明的 x 或在 g 中声明的 x,这取决于在特定时间调用 h 的那个。

于 2013-10-19T02:07:05.430 回答
0

这是完全证明的ans

静态作用域:一旦为全局变量分配了一个值,它的作用域将存在于整个程序执行过程中。因此,答案是:14并且14.as C 语言拥有静态作用域,您可以在 TURBO-C 编译器中检查它。

当你来到哪里

动态范围:与全局变量的值无关。考虑块中分配的值。因此答案是:f()=13g()=12

于 2014-03-25T18:13:58.203 回答
0

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

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

参考:GeeksforGeeks

于 2017-11-01T20:07:13.940 回答