## 1.3 常量 (Constants )
一個常量(constant)是一個有固定值的表達式。
### 字(Literals)
字是用來在程序源碼中表達特定的值。在前面的內容中我們已經用了很多的字來給變量賦予特定的值。例如:
~~~
a = 5;
~~~
這句代碼中5就是一個字常量。
字常量(literal constant)可以被分為整數(Integer Numbers), 浮點數(Floating-Point Numbers),字符(Characters)和字符串(Strings)。
### 整數(Integer Numbers)
~~~
1776
707
-273
~~~
他們是整型常數,表示十進制整數值。注意表示整型常數時我們不需要些引號(quotes ("))或任何特殊字符。毫無疑問它是個常量:任何時候當我們在程序中寫1776,我們指的就是1776這個數值。
除十進制整數另外, C++還允許使用八進制(octal numbers)和十六進制(hexadecimal numbers)的字常量(literal constants)。如果我們想要表示一個八進制數,我們必須在它前面加上一個0字符(zero character),而表示十六進制數我們需要在它前面加字符0x (zero, x)。例如以下字常量(literal constants)互相等值:
~~~
75 // 十進制 decimal
0113 // 八進制 octal
0x4b // 十六進制 hexadecimal
~~~
所有這些都表示同一個整數: 75 (seventy five) ,分別以十進制數,八進制數和十六進制數表示。
像變量一樣,常量也是有數據類型的。默認的整數字常量的類型為int型。我們可以通過在后面加字母u或l來迫使它為無符號(unsigned)的類型或長整型(long)。
~~~
75 // int
75u // unsigned int
75l // long
75ul // unsigned long
~~~
這里后綴u和l可以是大寫,也可以是小寫。
### 浮點數(Floating Point Numbers)
浮點數以小數(decimals)和/或指數冪( exponents)的形式表示。它們可以包括一個小數點,一個e字符(表示"by ten at the Xth height",這里X是后面跟的整數值) ,或兩者都包括。
~~~
3.14159 // 3.14159
6.02e23 // 6.02 x 10^1023
1.6e-19 // 1.6 x 10^-19
3.0 // 3.0
~~~
以上是包含小數的以C++表示的4個有效數值。第一個是PI,第二個是Avogadro數之一,第三個是一個電子(electron)的電量(electric charge)(一個極小的數值) – 所有這些都是近似值。最后一個是浮點數字常量表示數3。
浮點數的默認數據類型為double。如果你想使用float或long double類型,可以在后面加f或l后綴,同樣大小寫都可以:
~~~
3.14159L // long double
6.02e23f // float
~~~
### 字符和字符串(Characters and strings)
此外還有非數字常量,例如:
~~~
'z'
'p'
"Hello world"
"How do you do?"
~~~
前兩個表達式表示單獨的字符(character),后面兩個表示由若干字符組成的字符串(string) 。注意在表示單獨字符的時候,我們用單引號(single quotes (')),在表示字符串或多于一個字符的時候我們用雙引號(double quotes ("))。
當以常量方式表示單個字符和字符串時,必須寫上引號以便把他們和可能的變量標識或保留字區分開,注意以下例子:
~~~
x
'x'
~~~
x 指一個變量名稱為 x, 而'x'指字符常量'x'。
字符常量和字符串常量各有特點,例如escape codes,這些是除此之外無法在源程序中表示的特殊的字符,例如換行符 newline (\n) 或跳躍符tab (\t)。所有這些符號前面要加一個反斜杠inverted slash (\)。這里列出了這些escape codes:
|||
|---|---|
| **\n** | 換行符newline |
| **\r** | 回車carriage return |
| **\t** | 跳躍符tabulation |
| **\v** | 垂直跳躍vertical tabulation |
| **\b** | backspace |
| **\f** | page feed |
| **\a** | 警告alert (beep) |
| **\'** | 單引號single quotes (') |
| **\"** | 雙引號double quotes (") |
| **\?** | 問號question (?) |
| **\\** | 反斜杠inverted slash (\) |
例如:
~~~
'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"
~~~
另外你可以數字ASCII 碼表示一個字符,這種表示方式是在反斜杠(\)之后加以8進制數或十六進制數表示的ASCII 碼。在第一種(八進制octal)表示中,數字必需緊跟反斜杠(例如**\23**或**\40**),第二種(十六進制hexacedimal),必須在數字之前寫一個x字符(例如**\x20**或**\x4A**)。
如果每一行代碼以反斜杠inverted slash (\)結束,字符串常量可以分多行代碼表示:
~~~
"string expressed in \
two lines"
~~~
你還可以將多個被空格blankspace、跳躍符tabulator、換行符newline或其他有效空白符號分隔開的字符串常量連接在一起:
~~~
"we form" "a single" "string" "of characters"
~~~
最后如果我們想讓字符串使用寬字符(wchar_t),而不是窄字符(char),可以在常量的前面加前綴L:
~~~
L"This is a wide character string"
~~~
寬字符通常用來存儲非英語字符,比如中文字符,一個字符占兩個字節。
布爾型常量(Boolean Literals)
布爾型只有兩個有效的值:true和false,其數據類型為bool。
### 定義常量Defined constants (#define)
使用預處理器指令#define,你可以將那些你經常使用的常量定義為你自己取的名字而不需要借助于變量。它的格式是:
`#define identifier value`
例如:
~~~
define PI 3.14159265
define NEWLINE '\n'
define WIDTH 100
~~~
以上定義了三個常量。一旦做了這些聲明,你可以在后面的程序中使用這些常量,就像使用其它任何常量一樣,例如:
~~~
circle = 2 * PI * r;
cout
~~~
實際上編譯器在遇到#define指令的時候做的只是把任何出現這些 常量名(在前面的例子中為PI, NEWLINE或WIDTH)的地方替換成他們被定義為的代碼(分別為3.14159265, '\n'和100)。因此,由#define定義的常量被稱為宏常量macro constants。
define 指令不是代碼語句,它是預處理器指令,因此指令行末尾不需要加分號semicolon (;) 。如果你在宏定義行末尾加了分號(;) ,當預處理器在程序中做常量替換的時候,分號也會被加到被替換的行中,這樣可能導致錯誤。
### 聲明常量declared constants (const)
通過使用const前綴,你可以定義指定類型的常量,就像定義一個變量一樣:
~~~
const int width = 100;
const char tab = '\t';
const zip = 12440;
~~~
如果沒有指定類型(如上面最后例子中最后一行),編譯器會假設常量為整型int。