常量

常量是具有固定值的表示式。

字面量

字面量是最明顯的常量。 它們用於表達程式原始碼中的特定值。 之前我們已經使用過它們,例如,當我們寫下以下程式碼時,給變數賦予具體的值或者表達我們想要程式打印出的資訊:

1
a = 5;

這段程式碼中的 5 就是一個字面常量

字面常量可以分為整型字面量浮點字面量字元字串布林值

整型字面量


1
2
3
1776
707
-

它們是標識整數值的數字常量。 請注意,要表達一個數字常量,我們不需要寫引號 (") 也不需要任何特殊字元。 毫無疑問,它是一個常量:無論我們在程式中寫 1776 ,我們都將引用值 1776。

除了十進位制數(我們每天都習慣使用的數字)之外,C++ 允許使用八進位制數(基數為 8)和十六進位制數(基數為 16)作為字面常量。 如果我們想表達一個八進位制數,我們必須在它前面加上一個 0(一個字元)。 為了表達一個十六進位制數,我們必須在它前面加上字元 0xx)。 例如,以下字面常量彼此等效:

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。 如果您明確想要表達 floatlong double 數字字面量,則可以使用字尾 fl

1
2
3.14159L   // long double
6.02e23f   // float 

作為浮點數字常量的任何字母 (e, f, l) 都可以使用小寫或大寫字母書寫,而對其含義沒有任何影響。

字元和字串字面量

還存在非數字常量,例如:

1
2
3
4
'z'
'p'
"Hello world"
"How do you do?"

前兩個表示式表示單字元常量,以下兩個表示式表示由多個字元組成的字串字面量。 請注意,為了表示單個字元,我們將其括在單引號 (') 之間,為了表達字串(通常由多個字元組成),我們將其括在雙引號 (") 之間。

在編寫單字元和字串字面量時,有必要將它們用引號括起來,以將它們與可能的變數識別符號或保留關鍵字區分開來。 注意這兩個表示式之間的區別:

1
2
x
'x'

單獨的 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"

寬字元主要用於表示非英語或異國情調的字元集。

布林字面量

只有兩個有效的布林值:truefalse。 這些可以在 C++ 中表示為 bool 型別的值,方法是使用布林字面量 truefalse

定義常量 (#define)

您可以使用 #define 預處理器指令,為您經常使用的常量定義自己的名稱,而無需求助於消耗記憶體的變數。 它的格式是:

#define 識別符號 值
例如:

1
2
#define PI 3.14159
#define NEWLINE '\n' 

這定義了兩個新常量:PINEWLINE。 一旦定義了它們,您就可以在程式碼的其餘部分中使用它們,就好像它們是任何其他常規常量一樣,例如:

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 指令時所做的唯一事情就是按照它們已定義的程式碼,字面替換它們識別符號的任何出現(在前面的例子中,這些是 PINEWLINE)(分別是 3.14159'\n')。

#define 指令不是 C++ 語句,而是預處理器的指令; 因此,它假定整行作為指令,並且在其末尾不需要分號 (;)。 如果在末尾附加一個分號字元 (;),它也會附加到預處理器替換的程式正文中識別符號的所有出現位置。

宣告常量 (const)

使用 const 字首,您可以像宣告變數一樣宣告具有特定型別的常量:

1
2
const int pathwidth = 100;
const char tabulator = '\t';

在這裡,pathwidthtabulator 是兩個型別常量。 它們被視為常規變數,只是它們的值在定義後無法修改。
Index
目錄