编程语言简介/块作用域
外观
< 编程语言简介
块是解决作用域问题的方案之一。块是一个程序区域,其中包含变量定义,并界定这些定义适用的区域。在C
编程语言中,块是用一对花括号创建的。块的开始由左花括号 '{' 表示,结束由右花括号 '}' 表示。块将语句收集到一个单一的复合语句中。下面的C
代码展示了两个块。其中一个定义了主函数的作用域,而另一个(内部块)在该函数内部创建了一个新的作用域。可以看到两个变量定义使用相同的名称,但在不同的块内。
#include <stdio.h>
int main() {
int n = 1;
{
int n = 2;
printf("%d\n", n);
}
printf("%d\n", n);
}
定义的作用域是包含该定义的块,从定义点到块的末尾,减去任何在内部块中重新定义相同名称的作用域。因此,在第 3 行定义的变量 'n' 的作用域从该行开始,到第 9 行结束。但由于在这个块内有一个名为 'n' 的变量的新定义,因此在第 5 行到第 7 行之间,外部块中定义的变量 'n' 被隐藏了。下面的代码展示了相同的源代码,并区分了两个名为 'n' 的变量的可见性。第一个定义的作用域可见性用字母 'A' 表示,而第二个定义的作用域可见性用字母 'B' 表示。
#include <stdio.h>
int main() {
int n = 1; A
{ A
int n = 2; B
printf("%d\n", n); B
} B
printf("%d\n", n); A
} A
在不同的语言中,许多不同的构造充当块。术语“块结构化”通常指的是使用某种块来界定作用域的语言。如今,大多数编程语言都是块结构化的,很少有人会去区分这一点。
ML编程语言使用let
构造来定义一个块。下面的源代码展示了它的一个使用示例。let
构造包含定义(位于关键字 'in' 之前)和一个定义适用的区域(从每个定义的点到最后的结束)。字母 'A' 和 'B' 区分了源代码中的两个作用域。
let A
val n = 1 A
val x = n + 1 A
in A
let B
val n = 2 B
in B
n + x B
end B
end A