静态和动态范围界定

这个 范围 在程序的某个区域中,变量x的用法是指它的声明。范围界定的基本原因之一是保持程序不同部分中的变量彼此不同。由于只有少量短变量名,而且程序员在变量命名方面有着共同的习惯(例如,I代表数组索引),因此在任何中等大小的程序中,相同的变量名将在多个不同的范围内使用。 范围界定通常分为两类: 1. 静态范围界定 2. 动态范围界定 静态范围: 静态作用域也被称为 词汇范围界定 在这个范围中,变量总是指它的顶级环境。这是程序文本的属性,与运行时调用堆栈无关。静态作用域也使编写模块化代码变得更加容易,因为程序员只需查看代码就可以确定作用域。相比之下,动态范围要求程序员预测所有可能的动态上下文。 在大多数编程语言中,包括C、C++和java,变量总是静态的(或词汇的)范围,即变量的绑定可以由程序文本来确定,并且独立于运行时函数调用堆栈。 例如,下面程序的输出是10,即f()返回的值不依赖于调用它的人(比如g()调用它,并且有一个值为20的x)。f()总是返回全局变量x的值。

null

C

// A C program to demonstrate static scoping.
#include<stdio.h>
int x = 10;
// Called by g()
int f()
{
return x;
}
// g() has its own variable
// named as x and calls f()
int g()
{
int x = 20;
return f();
}
int main()
{
printf ( "%d" , g());
printf ( "" );
return 0;
}


输出:

10

总之,在静态范围中,编译器首先在当前块中搜索,然后在全局变量中搜索,然后在更小的范围中搜索。 动态范围界定: 对于动态范围,全局标识符指的是与最近的环境相关联的标识符,在现代语言中并不常见。在技术术语中,这意味着每个标识符都有一个全局绑定堆栈,并且在最近的绑定中搜索标识符的出现。 更简单地说,在动态作用域中,编译器首先搜索当前块,然后依次搜索所有调用函数。

C

// Since dynamic scoping is very uncommon in
// the familiar languages, we consider the
// following pseudo code as our example. It
// prints 20 in a language that uses dynamic
// scoping.
int x = 10;
// Called by g()
int f()
{
return x;
}
// g() has its own variable
// named as x and calls f()
int g()
{
int x = 20;
return f();
}
main()
{
printf (g());
}


使用动态作用域的语言输出:

20

静态与动态范围界定 在大多数编程语言中,静态作用域占主导地位。这仅仅是因为在静态范围中,仅仅通过查看代码就很容易推理和理解。只需查看编辑器中的文本,我们就可以看到范围内有哪些变量。 动态范围界定并不关心代码是如何编写的,而是它是如何执行的。每次执行一个新函数时,都会将一个新的作用域推送到堆栈上。 Perl 支持动态和静态作用域。Perl的关键字“my”定义了一个静态范围的局部变量,而关键字“local”定义了一个动态范围的局部变量。

Perl

# A perl code to demonstrate dynamic scoping
$x = 10;
sub f
{
return $x ;
}
sub g
{
# Since local is used, x uses
# dynamic scoping.
local $x = 20;
return f();
}
print g(). "" ;


输出:

20

本文由 维尼特·乔希 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享