字面常量


在程式中寫下 1、1.0、3.14159 這樣的數值,這類數值稱為字面常量(Literal constant),程式中若寫下一個整數值,例如 1 這個數值的話,預設會是個 int 型態無正負號的數值,而如果在程式中寫下 1.0,3.14 等小數時,預設會是 double 型態的數值,例如下面這個程式顯示出來的大小分別是 intdouble 的大小:

#include <iostream> 
using namespace std; 

int main() { 
    cout << "sizeof(1):\t"   << sizeof(1)   << "\n";
    cout << "sizeof(1.0):\t" << sizeof(1.0) << "\n";

    return 0; 
}

執行結果:

sizeof(1):      4
sizeof(1.0):    8

整數字面常量可以用 8 進位、10 進位與 16 進位,一般習慣使用 10 進位,如果要使用 8 進位的字面常量,開頭加上 0 就可以了,如果要使用 16 進位字面常量,開頭加上 0x,C++ 14 支援 2 進位表示,使用 0b 開頭。

例如下面的程式各顯示 10 進位制 26 的 8 進位、16 進位與 2 進位寫法:

#include <iostream> 
using namespace std; 

int main() { 
    cout << 26 << "\n";       // 10 進位
    cout << 032 << "\n";      // 8 進位
    cout << 0x1A << "\n";     // 16 進位
    cout << 0b11010 << "\n";  // 2 進位(C++ 14)

    return 0; 
}

由於 cout 輸出整數值時,都會以 10 進位制顯示,所以上面的程式中四行陳述都會顯示 26。

您可以在整數值之後加上 L,表示該整數值要是 long 型態,例如 1L,C++ 11 可以使用 LL 表示 long long,十進位整數字面常量預設是有號的,也可以指定為無號整數,可使用 Uu 來指定,例如 1ULU 可以同時指定,例如 1UL1LU;八進位或十六進位整數字面常量可能是有號或無號。

對於浮點數的話,可以在寫下浮點數值時,以 Ff表示使用 float 型態,例如 3.14f,也可以使用科學記號,例如 20000 可以表示為 2e4

字元字面常量則以單引號來包括一個字元,例如 'A''1' 都表示一個字元字面常量,而有些字元與 C++ 語法符號相同,例如 "'\ 等,在程式中表現這些字元要轉義(Escape),即 \"\'\\,其他還有一些「不可見字元」,也要以轉義來表示,底下列出常用的轉義表示:

  • \n:換行、新行(newline)
  • \t:水平定位點(horizontal tab)
  • \v:垂直定位點(vertical tab)
  • \b:退回一格(backspace)
  • \r:返回(carriage return)
  • \f:換頁(formfeed)
  • \a:嗶聲(alert bell)
  • \\:倒斜線(backslash)
  • \?:問號
  • \':單引號
  • \": 雙引號
  • \nnn:nnn 為一到三個 8 進位數字,表示字元編碼,例如 \115
  • \xnn.:nn 為多個 16 進位數字,表示字元編碼,通常用兩個數字,例如 \xb4\xfa
  • \unnnn:Unicode 碼點 U+nnnn 表示(C++ 11)
  • \Unnnnnnnn:Unicode 碼點 U+nnnnnnnn 表示(C++ 11)

其他還有 R"(...)"L"..."u8"..."u"..."U"..." 等字面常量,這就等到之後談到字串時一併說明。

C++ 內建的 I/O 控制器(manipulator)endl 會輸出換行字元並清空緩衝區,例如:

cout << "Hello! World!" << endl;

在 C++ 中如果以 "" 來包括一串文字的話,即為字串字面常數,例如 "Hello! World!" 就是字串字面常數,字串字面常量由 char 陣列組成,多位元組字元使用 char 來儲存碼元(code unit),每一個字串最後會以一個 null 字元結束。

truefalse 也是字面常數,對應型態為 bool