2.8 字面常數

什麼是字面常數?

字面常數(literal)就是直接寫在程式碼裡的固定值——它不是變數,值就寫死在那、不會改變。常見有這幾種:

int x = 123;          // 123 是整數字面常數
double pi = 3.14;     // 3.14 是浮點數字面常數
char c = 'A';         // 'A' 是字元字面常數(單引號、單一個字元)
cout << "Hello";      // "Hello" 是字串字面常數(雙引號、一串文字)

注意單引號和雙引號不一樣'A'(單引號)是一個字元char),"A"(雙引號)是一個字串(一串文字,這裡剛好只有一個字)。

整數字面常數的型態與後綴

你寫一個整數字面常數時,C++ 會自動幫它決定型態,規則是「從小到大、挑第一個裝得下這個數的型態」:

  • 100100000 這種,int 裝得下,型態就是 int
  • 100000000000010^{12})大到 int 裝不下的,C++ 會自動往上挑一個更大、裝得下的型態。所以即使你只寫 long long x = 1000000000000;,這個大數字也能正確存進去——C++ 不會因為你「沒加後綴」就把它截斷。

既然 C++ 會自動挑型態,那為什麼還需要後綴?在整數字面常數後面加上後綴,可以讓你主動指定它的型態——即使這個數小到 int 也裝得下。常用的有兩種:Llong 的縮寫)指定為 longLLlong long 的縮寫)指定為 long long

後綴 型態 範例
C++ 自動挑(夠小是 int、太大自動升成 long long 1001000000000000
L(或小寫 l 強制 long 100L100000L
LL(或小寫 ll 強制 long long 123LL100000LL

字元與字串字面常數

  • 字元字面常數:用單引號括住單一個字元,例如 '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,為什麼整個乘法的結果就對了?