在現代資訊社會中,電腦之所以在人類的工作、生活與學習中佔有如此關鍵的地位,其中一個重要的原因就在於它擁有極為強大的「運算能力」。當外部世界的資料(例如使用者輸入的數字、感測器讀取的數值、網路取得的資訊等等)透過各種介面與設備進入電腦系統後,電腦透過預先撰寫好的程式加以處理、計算,最後再將結果輸出供人類使用或做進一步的處理。程式設計師在撰寫C++程式時,必須對程式中的各類資料妥善規劃與分配,使它們在電腦記憶體中佔有合適的位置。而在C++世界中,我們最常聽到也最頻繁使用的兩種「資料儲存單元」便是「變數 (variable)」與「常數 (constant)」。
當程式執行時,外來的資料流入電腦,就如同旅客進入一間旅館,需要為其分配合適的客房。同理,電腦會在主記憶體中為程序所需的資料保留一塊空間,並以變數或常數的形式進行管理。變數與常數都是C++程式中用來儲存資料的「容器」。然而,它們最大的差別在於資料值是否能在程式執行過程中改變:變數(variable)所儲存的值可以隨程式的運行不斷更新變動,而常數(constant)在宣告後就不允許改變數值。透過變數和常數,我們可以在記憶體中為資料配置一個具名空間,使程式邏輯在使用、讀取與改寫資料時更為有條理且易於管理。
想像電腦的主記憶體猶如一座高級旅館,而變數和常數便是這旅館中的客房。不同的變數或常數可能需要不同大小的記憶體空間。就如同旅館中有各式各樣大小、價位與等級的房間,對應在電腦領域中,就是「資料型態 (data type)」決定了記憶體中所需空間的大小與型式。資料型態不僅決定可儲存數值的範圍和類別(如整數、浮點數、字元、布林值),也影響程式的運算與性能。
2-1 認識變數
在任一程式語言中,變數(variable)是不可或缺的核心基礎。變數是儲存在記憶體中的一塊空間,它能存放可變動的資料。當我們在程式中宣告一個變數,就如同告訴電腦:「請在記憶體中為我預留一個位置,未來我會放置某種型態的資料在此。」C++是「強型別」(strongly typed)語言,這表示你在使用變數前,必須先「宣告」該變數並指定其資料型態。也就是說,程式必須先明確規定該變數將儲存何種類型的資料(如整數、浮點數或字元),然後編譯器才會在記憶體中為它分配合適的空間。
一個變數具有以下四個要素:
- 名稱(Name):變數在程式中的標識符。你為變數取的名字必須符合C++的識別字命名規則,並且最好讓名稱能夠清楚表達其用途,增加程式可讀性。
- 值(Value):變數當前所儲存的資料值,程式在執行過程中可以更改這個值。
- 參考位置(Address):變數在記憶體中的儲存位置,通常以位址(address)表示。儘管在程式中並不必然要直接使用位址,但理解位址的概念對於進階應用(如指標操作)有極大幫助。
- 屬性(Type):變數所屬的資料型態。例如int代表整數,float代表浮點數等。
2-1-1 識別字命名原則
在C++程式碼中,我們經常看到以各種名稱表示的元素,如變數、函數、類別、物件……等等。這些名稱通通稱為「識別字 (identifier)」。識別字是程式碼中由程式設計師自行定義的名稱,用以讓程式碼更可讀和維護。然而必須注意,有些字詞是C++語言保留給自身使用的「關鍵字(keyword)」,例如int、for、if等,這些字不能用作變數名稱。
要正確命名變數,必須遵守以下規則:
- 識別字的第一個字元必須是英文字母或底線(_),不能以數字或特殊符號開頭。
- 中間可包含數字、字母、底線,但不可出現空白或其他特殊字元如@、$、%等。
- 名稱的長度應在合理範圍內(C++標準指出名稱有效字元可能有上限),但實務上很少會用到那麼長的變數名。
- C++對大小寫有區分。例如Name與name是兩個不同的識別字。
- 不可使用C++關鍵字作為識別字。
另外,為了程式碼的可讀性,我們通常推薦以具意義的英文單字命名,如sum代表總和、salary代表薪資;常數則習慣以大寫字母及底線分隔,例如PI、MAX_SIZE,以便於一眼就能區分出變數和常數。
2-1-2 變數宣告
在C++中使用變數前,必須先宣告它的資料型態與名稱。宣告變數的基本語法為:
資料型態 變數名稱; 你也可以在宣告的同時為變數設定初始值,如下:
int num = 10; //宣告並初始化 若你要同時宣告多個變數,且它們屬於相同的資料型態,也可採用逗號分隔的方式:
int a, b = 12, c; 在程式中,未經初始化的變數可能包含垃圾值(記憶體中原本的殘留數據),因此養成在宣告時同時初始化變數的良好習慣可避免許多除錯難題。
2-2 常數
與變數不同的是,常數(constant)在程式執行過程中值不會改變。C++中的常數有兩類:
- 字面常數 (Literal Constant):直接出現在程式碼中的值,如123、3.14、'A'、"Hello"都是字面常數。
- 定義常數 (Symbolic Constant):利用
const關鍵字或#define巨集指令為一個識別字賦予固定值。例如:cppconst int RADIUS = 10; #define PI 3.14159
在這之後,RADIUS與PI的值在整個程式執行期間都不會改變。通常,我們會以大寫字母命名常數,以便快速辨識該名稱對應的是一個不會改變的值。
2-3 基本資料型態
C++提供多種資料型態,最基本的可分為以下四類:
- 整數型態 (int):用來儲存整數值,如-100、0、78等。整數型態可再搭配修飾詞例如
short、long、unsigned、signed等,分別對儲存範圍和大小進行控制。 - 浮點數型態 (float, double, long double):用來儲存帶有小數點或科學記號的數值,如3.14159、-0.0003、5e2。
float為單精度、double為雙精度、long double精度更高。 - 字元型態 (char):用來儲存單一字元,包括字母、數字字符、特殊符號及控制字元。實際上char佔用1個位元組,以整數形式儲存ASCII碼。
- 布林型態 (bool):僅有兩個值:true(真)與false(偽),在內部則分別以1與0表示。
C++程式在處理資料時,除了考量字元的編碼(ASCII或Unicode),也會透過跳脫字元(escape character)來進行特定控制,如\n代表換行,\t代表水平制表符,\"代表雙引號字元等。透過跳脫字元,我們能在字串中包含特定不可見或有特殊意義的字元。
2-4 資料型態轉換
在程式中常會有不同資料型態同時出現在一個運算式中,這時就會發生「資料型態轉換(data type conversion)」的問題。C++支援兩種型態轉換:
-
自動型態轉換 (implicit conversion):當運算式中出現不同型態的資料時,編譯器會依據特定規則自動將較小範圍的資料擴大轉換為較大範圍的資料型態。例如int與double相加,會將int轉為double後再做運算。這種自動轉換不需要程式設計師介入。
-
強制型態轉換 (explicit conversion):當程式設計師想要刻意將某資料轉為另一種型態時,可以使用強制轉換運算子。例如,將整數強制轉成浮點數,以取得更精確的除法結果:
cppint sum = 239; float avg = (float) sum / 3; //將sum轉換為float後再除以3透過強制轉換,我們得以控制計算結果的精度與資料形式,避免不必要的截斷或誤差。
課後評量與練習
-
何謂變數,何謂常數?
變數是程式中儲存可變動資料的一塊記憶體空間,其值在程式執行期間可隨時變更。常數則是儲存固定不變的值,在程式執行期間不可對其值加以修改。 -
變數具備的四個要素是什麼?
(1) 名稱 (2) 值 (3) 參考位置 (記憶體位址) (4) 屬性(資料型態) -
變數命名必須遵守哪些規則?
識別字名稱開頭必須是字母或底線,不可有空白和特殊字元,不可使用關鍵字,區分大小寫,名稱應具意義。 -
如何以八進位與十六進位表示數字45?
八進位表示法:055(在數字前加0)
十六進位表示法:0x2D(在數字前加0x)
規則是八進位以0開頭,十六進位以0x開頭。 -
將浮點常數值轉換成float型態的方法?
在字面常數後面加上f或F,例如3.14f。 -
程式中有
cout<<"請輸入學號"08004512":";的錯誤在哪裡?
08004512可能被編譯器視為八進位數字常數而出現錯誤。必須將其放在字串內,如:cout<<"請輸入學號08004512:"; -
跳脫字元的含意:
'\t':水平跳格'\n':換行\":顯示雙引號\':顯示單引號\\:顯示反斜線
-
字元資料型態在輸出入上的選擇:
可選擇以字元本身的符號顯示,或以對應的ASCII碼數值顯示。 -
整數除法問題:
當對兩個整數相除時,如果想得到較精確的小數結果,必須先將整數轉成浮點數型態再相除,例如(float)x / y而非x / y。
APCS檢定考古題說明
-
程式執行時,變數值儲存在記憶體中。
-
進位轉換問題:將十六進位、八進位或其他進位的數字統一轉為十進位再進行加總或比較。
-
變數溢位的原因在於位元數量有限,當變數值超出其型態可表示範圍時,就會造成溢位。
-
整數相除後結果仍是整數,C/C++不會自動進行小數運算,必須明確轉型為浮點數才能得到小數結果。
透過本章內容,我們已對變數、常數及各種基本資料型態有初步認識,也理解了命名規則、資料型態轉換、以及在C++程式設計中如何合理配置與使用記憶體空間。這些基礎概念是未來撰寫更複雜程式邏輯的必備條件。隨著學習的深入,我們將更靈活地應用這些基本元素,組合出強大而高效的程式。
請先 登入 以發表留言。