2.8 字面常數
¶什麼是字面常數?
字面常數(literal)就是直接寫在程式碼裡的固定值——它不是變數,值就寫死在那、不會改變。常見有這幾種:
int x = 123; // 123 是整數字面常數
double pi = 3.14; // 3.14 是浮點數字面常數
char c = 'A'; // 'A' 是字元字面常數(單引號、單一個字元)
cout << "Hello"; // "Hello" 是字串字面常數(雙引號、一串文字)
注意單引號和雙引號不一樣:'A'(單引號)是一個字元(char),"A"(雙引號)是一個字串(一串文字,這裡剛好只有一個字)。
¶整數字面常數的型態與後綴
你寫一個整數字面常數時,C++ 會自動幫它決定型態,規則是「從小到大、挑第一個裝得下這個數的型態」:
- 像
100、100000這種,int裝得下,型態就是int。 - 像
1000000000000(10^{12})大到int裝不下的,C++ 會自動往上挑一個更大、裝得下的型態。所以即使你只寫long long x = 1000000000000;,這個大數字也能正確存進去——C++ 不會因為你「沒加後綴」就把它截斷。
既然 C++ 會自動挑型態,那為什麼還需要後綴?在整數字面常數後面加上後綴,可以讓你主動指定它的型態——即使這個數小到 int 也裝得下。常用的有兩種:L(long 的縮寫)指定為 long、LL(long long 的縮寫)指定為 long long:
| 後綴 | 型態 | 範例 |
|---|---|---|
| 無 | C++ 自動挑(夠小是 int、太大自動升成 long long) |
100、1000000000000 |
L(或小寫 l) |
強制 long |
100L、100000L |
LL(或小寫 ll) |
強制 long long |
123LL、100000LL |
¶字元與字串字面常數
- 字元字面常數:用單引號括住單一個字元,例如
'A'、'5'、' '(空格也算一個字元),型態是char。 - 字串字面常數:用雙引號括住一串文字,例如
"Hello"、"AA 競程"。
兩者很容易搞混,但它們是不同型態:'A'(單引號)是一個字元,"A"(雙引號)是一串文字。字串的完整用法上冊先不深入(留到下冊),這裡先認得「雙引號 = 字串字面常數」即可。
¶動手試試看
執行下面兩行、對比結果,親眼看看「字面常數的型態會影響運算結果」:
#include <iostream>
using namespace std;
int main() {
cout << 100000 * 100000 << endl; // 沒加後綴:int 相乘,會溢位
cout << 100000LL * 100000 << endl; // 加了 LL:long long 相乘,結果正確
return 0;
}
第一行會印出一個錯誤的怪數字(在常見環境是 1410065408),第二行才是正確的 10000000000——差別就在那個 LL。想一想:明明只在其中一個數字加了 LL,為什麼整個乘法的結果就對了?