什么是词法范围?
2022-08-29 22:27:06
什么是词法范围界定的简要介绍?
我通过例子来理解它们。:)
首先,在类似 C 的语法中,词法作用域(也称为静态作用域):
void fun()
{
int x = 5;
void fun2()
{
printf("%d", x);
}
}
每个内部级别都可以访问其外部级别。
还有另一种方法,称为 Lisp 的第一个实现所使用的动态作用域,同样采用类似 C 的语法:
void fun()
{
printf("%d", x);
}
void dummy1()
{
int x = 5;
fun();
}
void dummy2()
{
int x = 10;
fun();
}
这里可以访问 或 ,或任何调用其中声明的函数中的任何函数。fun
x
dummy1
dummy2
x
fun
x
dummy1();
将打印 5,
dummy2();
将打印 10。
第一个称为静态,因为它可以在编译时推导,第二个称为动态,因为外部作用域是动态的,并且依赖于函数的链调用。
我发现静态范围对眼睛来说更容易。大多数语言最终都以这种方式发展,甚至是Lisp(可以两者兼而有之,对吧?)。动态作用域类似于将所有变量的引用传递给被调用的函数。
作为为什么编译器无法推断出函数的外部动态范围的一个例子,请考虑我们的最后一个示例。如果我们这样写:
if(/* some condition */)
dummy1();
else
dummy2();
调用链取决于运行时条件。如果为 true,则调用链如下所示:
dummy1 --> fun()
如果条件为假:
dummy2 --> fun()
在这两种情况下,外部范围都是调用方加上调用方的调用方,依此类推。fun
仅提一下,C语言不允许嵌套函数或动态范围。
让我们尝试尽可能短的定义:
词法作用域定义了如何在嵌套函数中解析变量名称:即使父函数已返回,内部函数也包含父函数的作用域。
这就是它的全部内容!