變數的生命週期
盧冠綸 @ 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