# 【1-3】變數範圍 學校常廣播說:「X年X班,XXX同學」請到學務處 如果是跟你同班的同學,聽到後會知道在找你,趕緊提醒你去學務處;但如果是隔壁班的,就不見得認識你了;更不用說其它年級的學生。 再舉個例子,如果你在班上自我介紹,隔壁班的同學不會認識你;如果你在全校面前自我介紹,那隔壁班同學就會認識你。 這就是「變數範圍(scope)」,一個變數能被哪些地方的程式碼讀取或修改,取決於它的宣告位置。 ## 變數的位置 根據變數宣告的位置,在程式中,我們粗略分成「全域變數」和「區域變數」。 | 類型 | 說明 | 宣告位置 | | -------- | ----------------- | ------------ | | **全域變數** | 可以被整個程式所有函式使用 | 函式外 | | **區域變數** | 只能在函式或區塊內使用 | 函式或 `{}` 中 | ```cpp=1 #include <bits/stdc++.h> using namespace std; int m=20; // 全域變數 void add(){ int p=30; // 區域變數 } int main(){ int n=10; // 區域變數 for(int i=0;i<10;i++){ // 區域變數 i=i+n; } return 0; } ``` 區域變數除了出現在函式內,也可以存在任何一對 `{}` 中,例如 `if`、`while`、`for` 區塊。 全域變數就是第 0 層,`main()` 中就是第 1 層,`main()` 函式中的 `for` 迴圈就是第 2 層。 ```cpp 第 0 層:全域變數 { 第 1 層:main() 區塊變數 { 第 2 層:for 迴圈變數 } } ``` 結論:**變數的作用範圍,從宣告位置開始,一直到它所在的大括號 `{}` 區塊結束為止。** ## 想一想 觀察下方程式碼,哪些變數無法正確輸出呢?(複選) ```cpp= #include <iostream> using namespace std; int a = 10; void add(){ int b=30; cout << a << endl; // (A) } cout << b << endl; // (B) int main() { int c = 5; { int d = 2; cout << c << endl; // (C) } cout << d << endl; // (D) return 0; } ``` <details> <summary>解答</summary> 答案是(B)、(D) ```cpp= #include <iostream> using namespace std; int a = 10; // 第 0 層 void add(){ int b=30; // 第 1 層 cout << a << endl; // (A)第 1 層輸出第 0 層,正確 } cout << b << endl; // (B)第 0 層輸出第 1 層,錯誤 int main() { int c = 5; // 第 1 層 { int d = 2; // 第 2 層 cout << c << endl; // (C)第 2 層輸出第 1 層,正確 } cout << d << endl; // (D)第 1 層輸出第 2 層,錯誤 return 0; } ``` 想實際測試看看,可以把程式碼貼到 Code::Blocks 上執行,每次只輸出其中一個變數,來觀察程式能不能正常執行。 </details> --- 聯絡方式:codecodefunny@gmail.com 最後編修時間:2025/06/22 子柚筆