本節書摘來自華章出版社《c++程式設計教程(第3版)》一書中的第2章,第2.3節常量和變量,作者張志航,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
2.3 常量和變量
2.3.1 常量
在程式的運作過程中,其值不變的量稱為常量。程式設計者可以直接在程式中書寫常量。如在例1.2中有常量3和5。下面對各種類型的常量及其書寫形式做詳細介紹。
1.整型常量
1)十進制整型常量,如123、-456。
2)八進制整型常量,如0123、-016。
八進制整型常量以0(零)開頭,在數值中可以出現數字元号0~7。
3)十六進制整型常量,如0x123、-0xab。
十六進制整型常量以0x(零x)或0x開頭,在數值中可以出現數字元号0~9、a~f(或小寫的a~f)。
4)長整型與無符号型整型常量。
長整型常量,如12l、0234l、-0xabl、12l、0234l、-0xabl。
無符号型整型常量,如12u、0234u、0xabu、12u、0234u、0xabu。
在一個整型常量後加字尾l或l(小寫的l)表示該常量是長整型常量;在一個整型常量後加u或u(小寫的u)表示該常量是無符号型整型常量。
在程式中書寫的整型量,隻要它的數值範圍在int型量的範圍内,則它的預設資料類型是int型,而不是char型、short型或long型,如常量439是int型常量。
2.邏輯型常量
邏輯型常量隻有兩個,即true和false,分别代表邏輯“真”和邏輯“假”。
3.實型常量
實型常量在記憶體中以浮點形式存放,均為十進制數,無數制區分。兩種書寫形式如下所示。
1)小數形式:必須寫出小數點,如1.65、1.、.123均是合法的實型常量。
2)指數形式:也稱為科學表示法形式,如實型常量1.23×105和1.23×10-5在程式中可以書寫成1.23e5和1.23e-5。e或e前必須有數字,e或e後必須是整型量。例如,1000應寫成1e3,而不能寫成e3。
在程式中書寫的實型量,它的預設資料類型是double,而不是float,如1.23是double型量。如果想把一個實型常量表示成float型常量,可加字尾f或f,是以1.23e5f、1.23e5f、1.23f和1.23f均表示float型常量。
4.字元型常量
用單引号括起來的一個字元稱為字元型常量,如在程式中書寫的'a'、'a'、'?'和'#'分别表示4個字元,在記憶體中對應存放的是該4個字元的ascii碼值,其資料類型為char型。用這種方式隻能表示鍵盤上的可輸入字元,而ascii碼表(見附錄a)中的一些控制字元無法用這種方式表示。例如,ascii碼值為10的字元是控制字元,表示換行,無法用上述簡單方式表示。為此,c++提供了另外一種表示字元型常量的方法,即“轉義”字元。轉義字元是以反斜杠“”引導的特殊的字元型常量表示形式。一般地,'n'表示字母n,而'n'表示一個控制字元“換行”,跟随在“”後的字母n的意義發生了轉變,是以叫作轉義字元。在表2-3中列出了c++中預定義的轉義字元。
表2-3 c++中預定義的轉義字元

表2-3中倒數第2、3行是轉義字元的進階形式,它可以表示任一字元。例如,'n'表示控制字元“換行”,它的ascii碼是十進制數10,10的八進制和十六進制表示分别是12和a,是以'n'也可以表示成'12'、'xa'或'xa'。又如字母a的ascii碼是十進制數65,它的八進制和十六進制表示分别是101和41,是以在程式中,字母a可以表示成'a'、'101'或'x41'。特别注意表的最後一行,'0'是'ddd'的具體表示,其ascii碼值是0,它表示空字元,經常被用作字元串結尾标志。
5.字元串常量
字元串常量是用雙引号括起來的字元序列,如"china"、"how do you do."和"a"。字元串常量在記憶體中的存放形式是存儲其連續字元的ascii碼值,末尾加一個特殊字元'0',作為結尾标志,其意義見表2-3的最後一行。例如,字元串"china"在記憶體中的存儲形式如圖2-2所示。
注意:字元常量'a'和字元串常量"a"是不同的。字元常量'a'在記憶體中占用1位元組,而字元串常量"a"在記憶體中占用2位元組,如圖2-3所示。
2.3.2 符号常量
程式設計者可以在程式中直接書寫常量,但有時會遇到一些麻煩。例如,在進行數學計算時,程式中要多次使用π,則需要多次書寫3.141 592 6,這樣輸入程式時可能出現将數字輸入錯誤的情況。另外,計算時如果π的精度需要變化,如将3.141 592 6改為3.14,就需要在程式中進行多處修改。
c++提供了一種機制以避免上述麻煩。用一個辨別符代表一個常量,稱為符号常量。程式設計者可以在程式的開頭定義一個符号常量,令其代表一個值,在後續程式中可使用該符号常量。
符号常量的定義形式為:
define price 30
define pi 3.1415926
define s "china"
此3行代碼定義了3個符号常量,它們是price、pi和s。定義符号常量的好處是,如果在程式中多處使用了同一個常量,當需要對該常量修改時,隻需要在定義處修改一處即可,而不需要修改程式中的多處。給符号常量取有意義的名字有利于提高程式的可讀性,另外,一般使用大寫字母給符号常量命名。
下面用一個例子說明符号常量的使用。
例2.1 符号常量的使用。
`include
using namespace std;
define pi 3.14159
int main(void)
{
}`
程式中a行字元串"pi="中的pi是字元串常量的一部分,不是獨立的符号常量。
2.3.3 變量
在程式的運作過程中,其值可變的量稱為變量。一個變量有3個要素,即變量名、變量的存儲空間和變量的值。變量名必須用辨別符來辨別。變量根據其取值範圍的不同可分為不同類型的變量,如字元型變量、整型變量、實型變量等,是以不同類型的變量的存儲空間也不同。
1.變量定義
變量定義的一般格式為:
[<存儲類别>] <變量類型> <變量名1>,<變量名2>,…,<變量名n >
這裡不必關心變量的<存儲類别>,在後續有關章節中有詳細說明。定義變量的例子如下:
int a, b; // 定義2個整型變量a、b
unsigned u; // 定義1個無符号整型變量u
float f; // 定義1個單精度實型變量f
double d; // 定義1個雙精度實型變量d
char c1, c2, c3; // 定義3個字元型變量c1、c2、c3
變量必須先定義後使用,原因為:
1)變量定義指定變量的類型,編譯器根據類型給變量配置設定存儲空間,并建立變量名與其存儲空間的對應關系,程式中通過變量名給變量的存儲空間指派或讀取該存儲空間中的值,這一過程稱為變量的存取。
2)c++中某些運算對參加運算的資料類型有限制,變量具有類型後,便于編譯器對運算的合法性做檢查。
2.變量賦初值
當使用變量時,變量必須有值,給變量賦初值的方法有兩種,如下所示。
1)變量定義後,用指派語句賦初值。例如:
int a, b;
a = 12; b = -24;
char c1, c2;
c1 = 'a'; c2 = 'b';
此處“=”是指派運算符,表示将指派号右邊的值存入指派号左邊的變量對應的存儲空間中。
2)在定義變量的同時直接賦初值(稱為變量的初始化)。例如:
int a = 12, b = -24;
char c1 = 'a', c2 = 'b';
3.常變量
變量的值可以随時變化,即按需要給變量重新指派。但有時為了保護變量的值,不允許對變量做修改,則需要将變量說明成常變量,具體方法是在變量定義語句前加說明符const。例如:
const float pi = 3.14;
常變量定義時必須初始化。具體應用見函數形式參數等相關内容。