跳转到内容

编程语言简介/块作用域

来自维基教科书,开放的书籍,为开放的世界

块是解决作用域问题的方案之一。块是一个程序区域,其中包含变量定义,并界定这些定义适用的区域。在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

定义和作用域类型 · 命名空间作用域

华夏公益教科书