一、引言
????????在 C 語言里,作用域指的是程序中變量、函數、類型等標識符能夠被使用的范圍。C 語言里有四種主要的作用域:塊作用域、函數作用域、文件作用域和原型作用域,下面為你展開介紹:
二、塊作用域
? ? ? ?
- 定義:塊作用域是 C 語言中最常見的作用域類型,變量在由花括號 {}?所包圍的代碼塊內聲明時,就具有塊作用域。代碼塊能夠是函數體、循環體、條件語句體等。
- 規則
- 可見性:具備塊作用域的變量僅能在其聲明所在的代碼塊以及嵌套在該代碼塊內的子代碼塊中被訪問,在代碼塊外部,該變量不可見。
- 生命周期:塊作用域變量的生命周期從其聲明處開始,到包含該聲明的代碼塊執行結束時終止。一旦代碼塊執行完畢,變量所占用的內存就會被釋放。
- 示例
#include <stdio.h>
int main() {{int num = 10; // 此變量具有塊作用域printf("num 的值: %d\n", num);}// 下面這行代碼會引發編譯錯誤,因為 num 在該作用域不可見// printf("num 的值: %d\n", num); return 0;
}
三、函數作用域
- 定義:在 C 語言中,僅有 goto?語句的標簽具有函數作用域。
- 規則
- 可見性:函數作用域的標簽在整個函數內部均可見,不管標簽聲明在函數的哪個位置。
- 生命周期:標簽的生命周期和函數的執行周期一致,只要函數在執行,標簽就能夠被引用。
- 示例
#include <stdio.h>
void test() {goto end; // 跳轉到 end 標簽printf("這行代碼會被跳過。\n");
end:printf("已到達 end 標簽。\n");
}
int main() {test();return 0;
}
四、文件作用域
文件作用域
- 定義:當變量或函數在所有函數和代碼塊之外聲明時,它們就具有文件作用域。
- 規則
- 可見性:具有文件作用域的變量和函數在整個源文件中都可見。不過,若要在其他源文件中使用這些標識符,就需要進行恰當的聲明(使用 extern?關鍵字)。
- 生命周期:文件作用域變量和函數的生命周期從程序開始執行時起,到程序結束時止。
- 示例
#include <stdio.h>
// 具有文件作用域的變量
int globalVar = 20;
// 具有文件作用域的函數
void display() { printf("全局變量 globalVar 的值: %d\n", globalVar);
}
int main() {display();return 0;
}
五、原型作用域
- 定義:原型作用域僅適用于函數原型里聲明的參數。函數原型是在函數定義之前對函數的聲明,用于告知編譯器函數的名稱、返回類型和參數類型。
- 規則
- 可見性:函數原型中聲明的參數名僅在原型聲明的括號內有效。在函數原型外部,這些參數名不可見,編譯器只關注參數的類型。
- 生命周期:原型作用域參數的生命周期僅限于函數原型聲明本身,對函數定義中的參數沒有影響。
- 示例
#include <stdio.h>
// 函數原型
int sum(int a, int b);
// 函數定義
int sum(int x, int y) { return x + y;
}
int main() {int result = sum(3, 5);printf("兩數之和: %d\n", result);return 0;
}
六、作用域的嵌套和遮蔽
- 作用域的嵌套:C 語言中作用域能夠嵌套,比如一個函數內部可以包含多個代碼塊,每個代碼塊都有自身的作用域。當訪問一個變量時,編譯器會從當前作用域開始查找,若找不到,就會向上一級作用域繼續查找,直至找到該變量或者到達最外層作用域。
- 遮蔽:當不同作用域中聲明了同名的變量時,內層作用域的變量會遮蔽外層作用域的變量。也就是說,在內層作用域中使用該變量名時,訪問的是內層作用域的變量,而非外層作用域的變量。
- 示例
#include <stdio.h>
int num = 10; // 具有文件作用域的變量
int main() {int num = 20; // 具有塊作用域的變量,遮蔽了文件作用域的 numprintf("塊作用域 num 的值: %d\n", num);{int num = 30; // 內層塊作用域的變量,遮蔽了外層塊作用域的 numprintf("內層塊作用域 num 的值: %d\n", num);}return 0;
}