iT邦幫忙

0

【從零開始的 C 語言筆記】第二十六篇-變數的生命週期(1)

  • 分享至 

  • xImage
  •  

上一篇我們介紹了副函式的概念,一般來說我們會把特別處理某些資料的部分,另外拉出一個副函式來處理,除了更好閱讀之外,也會增加程式的可維護性,當某個功能出問題,只要專注處理負責該功能的函式就可以了。

雖然先前第六篇已經大概介紹過變數的用法跟概念了,不過今天我們來深入介紹變數的使用範圍與生命週期吧!


變數的生命週期?

看到生命週期大家或許會有點困惑,變數就是變數還有生命嗎?事實上變數會從被宣告的當下誕生,記憶體會分配一個位置給它,直到區塊結束、程式結束後就不再有效,會不能存取也找不到它,我們稱這個誕生到結束的過程為「變數的生命週期」。

一般介於「{ }」內的變數,變數存在的生命週期會僅限在內,超過「{ }」之外便會消亡,我們可以從以下程式碼看見:

#include <stdio.h>

int main()
{
    int i = 10;

    printf("%d\n",i);
    for(int i=0; i<5; i++){
        printf("%d\n",i);
    }
    printf("%d\n",i);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211122/20142565hjPFRkCpVU.png

第一次宣告的變數是在main function的整數i(為10),而第一次列印的結果也是10。

但第二次宣告的變數在for迴圈中,且為遞增的變數i,並隨著for迴圈列印了0到4,而不是for迴圈外的10。

但當for迴圈結束後,列印出的變數則是第一次宣告的10。
https://ithelp.ithome.com.tw/upload/images/20211122/20142565DrPm1xjsMB.png


區域變數、全域變數?

先前我們有提到如果變數被宣告在「{ }」的區域內,那在超過「{ }」的範圍後就會消亡,所以我們不可能在變數宣告的區域範圍外使用它,而我們稱這種變數為「區域變數」;那如果我們要宣告一個全程式區域都可以使用的變數,也就是「全域變數」時要怎麼做呢?

  1. 區域變數

(1) 以函式為範圍
但凡離開宣告變數的「{ }」範圍外,變數便不可再使用,且主函式宣告的變數,在副函式是不可以使用的,因副函式已經出了主函式範圍之外。

#include <stdio.h>

void test();

int main()
{
    int x = 10;

    printf("%d\n",x);
    test();
    printf("%d\n",x);

    return 0;
}

void test(){
    int x = 5;
    printf("%d\n",x);
}

https://ithelp.ithome.com.tw/upload/images/20211122/20142565tXF89AI5Qx.png

如同列印結果,主函式宣告的變數出了主函式範圍,在副函式是不可使用變數的,但在副函式宣告同名變數並不衝突,只是副函式宣告的變數,也只能在副函式中使用。
https://ithelp.ithome.com.tw/upload/images/20211122/20142565gCdFiWhB2D.png
https://ithelp.ithome.com.tw/upload/images/20211122/20142565GCpXSdbCmZ.png
(2) 以小區塊為範圍
前面有提到若離開宣告變數的「{ }」範圍外,變數便不可再使用,但若在範圍之內的小區塊(如for、while、if等等區塊)又宣告同名變數,則在小區塊內變數將以小區塊變數覆蓋,但一出小區塊範圍也不可使用。

#include <stdio.h>

int main()
{
    int i = 10;

    printf("%d\n",i);
    for(int i = 1; i<=5; i++){
        printf("%d\n",i);
    }
    printf("%d\n",i);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211122/20142565ZMLjKuJt8F.png
如同列印結果,在for迴圈區塊內又宣告同名變數,在其區塊範圍內會暫時覆蓋,直到離開該區塊則區塊變數便不可使用。
https://ithelp.ithome.com.tw/upload/images/20211122/20142565yCuNHIIzCV.png
https://ithelp.ithome.com.tw/upload/images/20211122/20142565J21AymszOy.png
2. 全域變數
如果要宣告一個全程式都可以使用的「全域變數」,我們將宣告在主函式外,通常為主函式部分之前。

#include <stdio.h>

int x = 15;
int main()
{
    printf("%d\n", x);
    test();
    printf("%d\n", x);

    return 0;
}

void test(){
    printf("%d\n", x);
}

https://ithelp.ithome.com.tw/upload/images/20211122/20142565gLnUuH7kgd.png
可以從結果看到若宣告為全域變數,且未被區域的同名變數覆蓋的話,程式的全區域都可以使用這個變數。
https://ithelp.ithome.com.tw/upload/images/20211122/20142565ICHx5Z7vZa.png


小結

  1. 變數是有使用的範圍的,且出了範圍就會自動消亡,而變數誕生至消亡則為變數的生命週期。

  2. 非全程式可使用之變數為區域變數,反之則是全域變數。

  3. 主函式宣告之變數,出了主函式便不可使用(如到了副函式時);副函式宣告之變數,出了副函式便不可使用(如回到主函式或任何不在副函式範圍的地方);被小區塊(for、while、if等區塊)宣告之變數,出了小區塊後便不可使用。

  4. 變數是可以被不同範圍的同名區域變數覆蓋的。


看到這裡就大概學習完什麼是變數的生命週期,還有區域變數、全域變數的不同了,弄清楚變數的存在、使用範圍是很重要的事情,希望大家看完可以比較好理解!

下一篇我們來繼續介紹變數的生命週期,如果出了範圍就會消失,那有沒有可以被保存、一直存在的變數呢?


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言