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