常量
常量是具有固定值的表示式。
字面量
字面量是最明顯的常量。 它們用於表達程式原始碼中的特定值。 之前我們已經使用過它們,例如,當我們寫下以下程式碼時,給變數賦予具體的值或者表達我們想要程式打印出的資訊:
這段程式碼中的
5
就是一個
字面常量。
字面常量可以分為
整型字面量、
浮點字面量、
字元、
字串和
布林值。
整型字面量
它們是標識整數值的數字常量。 請注意,要表達一個數字常量,我們不需要寫引號 (
"
) 也不需要任何特殊字元。 毫無疑問,它是一個常量:無論我們在程式中寫
1776
,我們都將引用值 1776。
除了十進位制數(我們每天都習慣使用的數字)之外,C++ 允許使用八進位制數(
基數為 8)和十六進位制數(
基數為 16)作為字面常量。 如果我們想表達一個八進位制數,我們必須在它前面加上一個
0
(一個
零字元)。 為了表達一個十六進位制數,我們必須在它前面加上字元
0x
(
零,
x)。 例如,以下字面常量彼此等效:
1 2 3
|
75 // decimal
0113 // octal
0x4b // hexadecimal
|
所有這些都代表相同的數字:75(七十五),分別表示為十進位制數字、八進位制數字和十六進位制數字。
與變數一樣,字面常量也被認為具有特定的資料型別。 預設情況下,整數字面量是
int 型別。 但是,我們可以透過附加
u 字元來強制它們為無符號型別,或者透過附加
l 來強制它們為長整型。
1 2 3 4
|
75 // int
75u // unsigned int
75l // long
75ul // unsigned long
|
在這兩種情況下,字尾都可以使用大寫或小寫字母指定。
浮點數
它們表達帶有小數和/或指數的數字。 它們可以包括小數點、
e
字元(表示“乘以 10 的 X 次方”,其中 X 是跟隨
e
字元的整數值),或者同時包括小數點和
e
字元。
1 2 3 4
|
3.14159 // 3.14159
6.02e23 // 6.02 x 10^23
1.6e-19 // 1.6 x 10^-19
3.0 // 3.0
|
這些是在 C++ 中表達的四個有效的帶小數點的數字。 第一個數字是 PI,第二個數字是阿伏伽德羅數,第三個是電子的電荷(一個非常小的數字)- 它們都是近似值 - 最後一個是將數字三表示為浮點數字面量。
浮點字面量的預設型別是
double。 如果您明確想要表達
float 或
long double 數字字面量,則可以使用字尾
f
或
l
。
1 2
|
3.14159L // long double
6.02e23f // float
|
作為浮點數字常量的任何字母 (
e
,
f
,
l
) 都可以使用小寫或大寫字母書寫,而對其含義沒有任何影響。
字元和字串字面量
還存在非數字常量,例如:
1 2 3 4
|
'z'
'p'
"Hello world"
"How do you do?"
|
前兩個表示式表示單字元常量,以下兩個表示式表示由多個字元組成的字串字面量。 請注意,為了表示單個字元,我們將其括在單引號 (
'
) 之間,為了表達字串(通常由多個字元組成),我們將其括在雙引號 (
"
) 之間。
在編寫單字元和字串字面量時,有必要將它們用引號括起來,以將它們與可能的變數識別符號或保留關鍵字區分開來。 注意這兩個表示式之間的區別:
單獨的
x
將引用一個識別符號為
x
的變數,而
'x'
(括在單引號內)將引用字元常量
'x'。
字元和字串字面量具有某些特性,例如轉義碼。 這些是在程式的原始碼中難以或不可能以其他方式表達的特殊字元,例如換行符 (
\n
) 或製表符 (
\t
)。 它們都以反斜槓 (
\
) 開頭。 以下是一些轉義碼的列表:
\n | 換行 |
\r | 回車 |
\t | 製表符 |
\v | 垂直製表符 |
\b | 退格 |
\f | 換頁(進紙) |
\a | 警告(蜂鳴) |
\' | 單引號 (') |
\" | 雙引號 (") |
\? | 問號 (?) |
\\ | 反斜槓 (\) |
例如:
1 2 3 4
|
'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"
|
此外,您可以透過其數字 ASCII 碼來表示任何字元,方法是編寫一個反斜槓字元 (
\
),後跟以八進位制(
基數-8)或十六進位制(
基數-16)數字表示的 ASCII 碼。 在第一種情況(八進位制)中,數字必須緊跟在反斜槓之後(例如
\23
或
\40
),在第二種情況(十六進位制)中,必須在數字本身之前寫入
x
字元(例如
\x20
或
\x4A
)。
透過在每個未完成行的末尾放置一個反斜槓符號 (
\
),字串字面量可以擴充套件到多行程式碼。
1 2
|
"string expressed in \
two lines"
|
您還可以透過一個或多個空格、製表符、換行符或任何其他有效的空白字元分隔它們來連線幾個字串常量。
1
|
"this forms" "a single" "string" "of characters"
|
最後,如果我們希望字串字面量明確地由寬字元 (
wchar_t 型別) 而不是窄字元 (
char 型別) 組成,我們可以在常量前加上
L
字首。
1
|
L"This is a wide character string"
|
寬字元主要用於表示非英語或異國情調的字元集。
布林字面量
只有兩個有效的布林值:
true 和
false。 這些可以在 C++ 中表示為
bool 型別的值,方法是使用布林字面量
true
和
false
。
定義常量 (#define)
您可以使用
#define
預處理器指令,為您經常使用的常量定義自己的名稱,而無需求助於消耗記憶體的變數。 它的格式是:
#define 識別符號 值
例如:
1 2
|
#define PI 3.14159
#define NEWLINE '\n'
|
這定義了兩個新常量:
PI 和
NEWLINE。 一旦定義了它們,您就可以在程式碼的其餘部分中使用它們,就好像它們是任何其他常規常量一樣,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
// defined constants: calculate circumference
#include <iostream>
using namespace std;
#define PI 3.14159
#define NEWLINE '\n'
int main ()
{
double r=5.0; // radius
double circle;
circle = 2 * PI * r;
cout << circle;
cout << NEWLINE;
return 0;
}
|
31.4159 |
事實上,編譯器預處理器在遇到
#define
指令時所做的唯一事情就是按照它們已定義的程式碼,字面替換它們識別符號的任何出現(在前面的例子中,這些是
PI 和
NEWLINE)(分別是
3.14159
和
'\n'
)。
#define
指令不是 C++ 語句,而是預處理器的指令; 因此,它假定整行作為指令,並且在其末尾不需要分號 (
;
)。 如果在末尾附加一個分號字元 (
;
),它也會附加到預處理器替換的程式正文中識別符號的所有出現位置。
宣告常量 (const)
使用
const
字首,您可以像宣告變數一樣宣告具有特定型別的常量:
1 2
|
const int pathwidth = 100;
const char tabulator = '\t';
|
在這裡,
pathwidth
和
tabulator
是兩個型別常量。 它們被視為常規變數,只是它們的值在定義後無法修改。