變數的生命週期

盧冠綸 @ sprout 2021 C/C++ 語法班

The 偷

(題目照片)

Credit to : Leyna

The 偷 part 2

(題目照片)

Credit to : Leyna

這兩個看起來差不多啊?

事實上,每個變數都會有自己的生命週期。

剛剛的例子,就告訴了我們,

並不是每個變數都是永久存在的。

所以,這就是為什麼我們需要去建立關於變數生命週期的概念

變數的生命週期大致分為以下幾種

  • 全域變數
  • 區域變數

進入正題~

全域變數

 

  • 在所有大括號(包括main的大括號)外面宣告
  • 在整個程式中都有效(所有函式都可以自由取用)
  • 優點:全域變數的陣列可以開很大
  • 缺點:容易出bug,所以可以的話盡量避免使用

全域變數

圖中的pi,就是一個全域變數,

在整個程式內都有效

區域變數

 

  • 在某些大括號內宣告。
  • 只在大括號內,以及大括號前的前導敘述(用小括號包起來的那一串)內有效。

區域變數

這裡的pi,就是一個區域變數,

因為他是在main的大括號裡面被宣告的,

main外面(例如length裡面)就沒辦法使用。

區域變數

這裡的 i,就是屬於for迴圈的那個大括號,

因此當這個大括號結束後,i就會消失了。

那,區域變數這東西對我們能有什麼好處?

為什麼不要讓每個變數都活到永久呢?

the 偷 part 3 (大十字)

Credit to : 盧冠綸

「偷自己程式的事,能算偷嗎?」,接連便是難懂的話,什麼「變數」,什麼「生命週期」之類,引得眾人都哄笑起來。教室裡充滿著快活的空氣。

要是每個變數都活到永久,那你的城市一旦很大...

程式啦乾!

同名的變數?

小挑戰:猜猜看會輸出什麼呢?

同名的變數?

在main裡面的a,和plusone裡面的a,

雖然名字一樣,但是作用範圍完全不衝突,

所以你大可以把他們當成不一樣的東西。

遮蔽效應

當你在不同大小但重複的範圍內宣告同一個名字的變數...

程式會以最新宣告(或範圍比較小的)為準

https://pt.memedroid.com/memes/detail/2811889/Use-pi-5

所以大家在使用巢狀迴圈,或是多維陣列的時候,

記得要小心變數不要重複宣告...

這是對的                                                  這是錯的

遮蔽效應

命名空間(namespace)

有點像是收納盒的概念,用來分類變數。

 

不同的命名空間裡面可能會有相同的變數名稱。

 

std就是一個namespace。

 

命名空間(namespace)

指令:using namespace [命名空間名稱](如左):

功能:直接存取空間裡面的任何成員。

 

指令:using [命名空間名稱]::[命名空間成員](如右):

功能:直接存取空間裡面的指定成員。

命名空間(namespace)

為什麼之前說盡量少用using namespace std; ?

 

 

因為std裡面不只有cin和cout兩個指令而已,事實上還有其他東西存在裡面,所以直接using namespace std 有可能會導致撞名。

小整理

變數是:

生於宣告,

死於大括號結束之處。

全域變數:不在任何大括號內。

區域變數:看他出生在哪個大括號內,

                   就會死在大括號結束之處。

遮蔽效應:以最新宣告者為主。小心不要出bug。

小整理

大家可以在自己的電腦裡面,自己試玩看看我們剛剛說的各種變數的生命週期哦!

變數的生命週期

By allen522019

變數的生命週期

  • 565