跳轉到內容

程式語言簡介/塊作用域

來自華夏公益教科書,開放的書籍,為開放的世界

塊是解決作用域問題的方案之一。塊是一個程式區域,其中包含變數定義,並界定這些定義適用的區域。在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

定義和作用域型別 · 名稱空間作用域

華夏公益教科書