---
# System prepended metadata

title: 【1-3】變數範圍

---

# 【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 子柚筆