無痛入手 C++:基礎教學7 - 變數範圍

閱讀時間約 6 分鐘

變數宣告的位置會決定它的「可視範圍」任何陳述都只使用所屬範圍內變數,範圍外的變數是"無法看見"的,當然也就無法使用。

這篇會介紹兩種變數範圍常見的判斷方式:
1. 大括號: 宣告在大括號內的變數,只能被大括號內的陳述所使用。
2. 陳述: 宣告在陳述內的變數,只能在該陳述內被使用。

全域變數 (global variable)

宣告在 main 的大括號以外的變數稱為全域變數,顧名思義,程式中的所有陳述都能看見並存取它。如下所示:

#include <iostream>

using namespace std;

int x = 0;

int main() {
cin >> x;
if (!x) {
x = 100;
}
cout << x;
return 0;
}

因為 x 被宣告在 main 外面,因此 main 中的任何陳述都可以存取它。

注意: 寫程式的時候應該要盡量避免使用全域變數,因為在大型軟體中,濫用全域變數會讓程式變得難以分析、容易產生 bug。

區域變數 (local variable)

宣告在大括號內的變數基本上都是區域變數。我們在 main 以及 if、else if、else 以及 switch 都會使用大括號將陳述包起來,在裡面宣告的變數就是區域變數。執行看看下面的程式,看看會發生什麼錯誤:

if (true) {
{int x = 10;}
{cout << x;}
}

由於 int x = 10;cout << x; 屬於不同的範圍,cout "看不見" x,自然就無法將它的值印出來。下面舉幾個正確的寫法:

// case1​
if (true) {
int x = 10;
cout << x;
}

// case2
if (true) {
{
int x = 10;
cout << x;
}
}

// case3
if (true) {
int x = 10;
{ cout << x; }
}

case 1 是一般的寫法,相信大家都可以理解。
case 2 用額外的一組大括號將兩個陳述包在一起,它們仍然在相同的範圍內,所以是正確的。
case 3 的話,雖然 cout << x; 自己被包在額外的大括號內,但它和 int x = 10; 都被包在第一組大括號內,因此也符合「在同一個大括號內」。

宣告在陳述內的變數也是區域變數,如宣告在 if、else if 以及 for 的小括號內:

// true
if (int x = 1) {
cout << x << '\n';
}

for (int i = 0; i < 3; ++i) { }
// can not use i here

第二行的 if 在小括號中宣告且初始化了一個變數 x,在這種情況,電腦會取出 x 的值來當作條件判斷: 因為 x 的值為 1,且非 0 的整數都換被轉換成布林值的真 (true),所以第二行的條件判斷結果為真。
此外, if 的小括號和大括號屬於同一個範圍 (都屬於 if 陳述),所以第三行可以使用第二行所宣告的 x。

第六行的話則是常見的 for 寫法,因為 x 是宣告在小括號內的,所以只有在 for 裡面可以使用,在 for 的小括號或是大括號外使用 i 是不合法的行為。

變數的遮蔽

下列的程式分別在第一行和第三行都宣告了叫做 x 的變數,執行看看。

int x = 1;
if (true) {
int x = 2;
cout << x;
}

程式會印出 2,這是因為當範圍較小的變數宣告和範圍較大的變數宣告出現相同的名稱時,小範圍的宣告會遮蔽大範圍的暄號,也就是說,第三行的宣告遮蔽了第一行的宣告,所以第四行才會印出 2。

下面再舉一個例子:

int x = 1;
if (true) {
int x = 2;
cout << x << '\n';
}
cout << x;

第六行會印出 1,因對第一行跟第六行在相同的範圍內,所以第六行看見的 x 是第一行所宣告的。

小心不要把宣告跟指定運算子 (=) 的效果搞混,如果把第三行改成 x = 2 的話:

int x = 1;
if (true) {
x = 2;
cout << x << '\n';
}
cout << x;

第三行使用的 x 是第一行所宣告的,因為沒有其他更小的範圍有宣告 x。所以第三行把 x 的值改成 2 以後,第四行跟第六行都會印出 2。

下面再舉一個例子:

int x = 1;
if (true) {
int x = 2;
{
x = 3
}
cout << x << '\n';
}
cout << x;

會印出 3 和 1。第七行看到的是第三行宣告的 x,這個 x 在第五行的時候被改成了 3;第九行看到的則是第一行的 x,它的值並沒有被修改,因此第九行印出的還是 1。

注意: 以上的程式只是為了說明變數範圍而設計的。實際上在寫程式的時候,請盡量幫小範圍的變數取另一個名字,不要測試讀程式的人的耐心。


習題

  1. 以下程式會印出什麼結果?
#include <iostream>

using namespace std;

int x = 0;
int main() {
cout << x << '\n';
int x = 1;
if (int x = 2) {
cout << x << '\n';
{
x = 3;
int x = 4;
}
cout << x << '\n';
x = 5;
}
cout << x << '\n';
return 0;
}
2會員
14內容數
程式設計 & 電腦系統 & 系統軟體
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
無痛每月創造被動收入!不能錯過的0擼躺賺區塊鏈項目GrassGrass 是由一家去中心化人工智慧領域的初創公司Wynd Network,在2023年6月所推出的去中心化網路資源共享平台。
avatar
GRAY的離職日記
2024-04-21
姊妹們請進!無痛入手CCD相機!從去年就開始火的CCD相機,美女、網紅現在幾乎人手一台,拍出來的照片張張都有氛圍感!CCD相機不僅記錄下每一個瞬間,更賦予與手機影像不同且難以言喻的深度和質感。今天就來推薦幾款CCD相機。【此篇文章內容引用自新識界】
Thumbnail
avatar
一灘爛泥
2024-03-20
無痛學習的模樣期許未來的自己能幫助更多對英文恐懼或排斥的孩子看到更多這個世界裡頭的有趣與價值。為了達到這個目標,用心準備每一堂課,在課堂中好好陪伴每一位學生學習是現在的我能努力做好的事。
avatar
Evelyn
2023-12-02
「無痛離世」與「山中靜夫的最後尊嚴」觀後感論語裡孔子曾說過:「未知生,焉知死?」過了五十歲之後,我反而有一種「先知死,而後生」的體悟。 最近因為一些因素,對於「死亡」的歷程必須先行預習,所以連續看了兩部日本電影:「無痛離世」跟「山中靜夫的最後尊嚴」。同樣聚焦在癌症末期的主題,同樣超級寫實的演繹了病人在世間最後辛苦的時光,讓我可以先預習癌末
Thumbnail
avatar
soso
2023-09-24
無痛用Bitwarden取代Google Authenticator透過Google Authenticator轉移帳戶的功能,可以一次性提取所有TOTP密鑰,加快整合TOTP到Bitwarden的過程。整合完成後,不論是輸入帳號密碼或是輸入TOTP認證碼,都只需要Bitwarden即可搞定,在安全性和方便性取得平衡。在方便性和安全性之間取得平衡,是資安永遠的課題。
Thumbnail
avatar
GYB
2023-09-14
無痛手術是怎樣出現的?在另一次快速的截肢手術中,李斯頓雖然饒過病人的睪丸,卻意外切斷助理的兩根手指。後來病人與助理雙雙死於壞疽,而一名在旁觀看這場手術的人,看見李斯頓匆忙揮舞手術刀,刀子戳破了外套,還以為李斯頓被戳死,因此嚇得休克,一命嗚呼。在麻醉劑出現之前的年代,手術就是這麼危險。
Thumbnail
avatar
臉譜出版
2023-08-18
無痛考取人生第一張金融證照|金融市場常識與職業道德  為了未來就業穩定,目前打算以成為公股銀行行員的目標邁進!打算花半年至一年的時間考取Fit(金融基測),再慢慢考一些有的沒的法定考試(好痛苦...)   先說我報名證基會2023/7/7的紙筆考試,大概從2023/6/27開始準備,準備時長10天左右。但我不能說自己是非常認真準備的學生,主要原因是
Thumbnail
avatar
高高愛噗大冒險 // Go & Ape's writing
2023-07-10
無痛致富讀書心得2,單筆投資為何比定期定額好? 投資必勝九大金律大綱: 1.股利的三大迷思 2.投資中第1~3級思考 3.大部分的人虧損的原因 4.兩個最有效率的投資策略 5.單筆投資與定期定額的差別。 6.長期投資成功的關鍵是什麼? 7.已實現和未實現報酬的差異。 8.股票賣出的三大理由。 9.投資必勝九大金律。 讀書心得分成兩篇,上篇的連結 本文PODCAS
Thumbnail
avatar
威利財經生活隨筆
2023-04-07
無痛致富讀書心得1,股市長期是秤重機大綱: 1.適合誰閱讀 2.股市秤重機 3.風險管理的兩大誤區 4.長期投資的七大優勢 5.股利是雙面刃 【無痛致富】,去年10/26號上市。作者是佛里曼投資顧問團隊(Freeman Publications),總部位於英國倫敦,提供個人專業的投資理財顧問服務,將最複雜的投資策略以易於理解的語言傳達
Thumbnail
avatar
威利財經生活隨筆
2023-04-05
【迷你水晶洞】錢包無痛入手,招財開運又好看水晶洞功效: 水晶洞又稱作是風水石,裡面充滿漂亮的晶牙、水晶花,彼此能量互相震動凝聚磁場!能夠聚財納福、避邪擋煞、吉祥平安。且晶洞本身就是源源不絕的發電廠,可以幫其他水晶淨化、消磁。 迷你晶洞擺放在辦公桌: 在工作上有貴人幫助、專注辦公、防止小人陷害、被老闆讚許、加薪升官的機會! 迷你晶洞擺放在正財
Thumbnail
avatar
吉祥水晶
2022-03-15