讀C++標準系列 - 2.13 Literals

返回目錄

C++支持以下5種類型的常數:
  1. 整型常數
  2. 字符常數
  3. 浮點常數
  4. 字符串常數
  5. 布爾常數

1、整型常數
(注:因爲long long是C++0X才正式加入的,所以目前不同的編譯器對它的支持和標準的描述還有些出入)

有三類整型常數:
十進制,以1~9開頭
八進制,以0開頭
十六進制,以0x或者0X開頭

你可以在整型常數後面加上後綴來明確它的類型(2.13.1-2)。
如果你不顯式指定類型後綴的話,十進制整型常數會自動根據你常數的大小從int,long,long long中選擇合適的類型,而八進制與十六進制常數會同時從有符號和無符號的類型中選擇。
如果你指定了l後綴,那麼不會考慮int和unsigned int;如果指定了ll後綴,那麼只會考慮long long和unsigned long long。
如果你指定了u後綴,那麼只會從無符號類型中選擇。
如果所有合適的類型都不足以存放整型常數,那麼會自動使用擴展的整型類型(2.13.1-3,擴展的整型類型定義參見3.9.1-2和3.9.1-3)。如果具體的實現沒有提供擴展的整數類型,或者擴展的整數類型依然無法存放整型常數,那麼程序是ill-formed

注意,u和l的位置可以互換,所以ul和lu都是可以的。(但是VC8目前還不支持llu,只支持ull)

看看你是不是能正確說出下面這些整型常數的類型?
1
1U
1LU
1ULL
2147483647
2147483648
017777777777
020000000000
0x7FFFFFFF
0xFFFFFFFF
4294967296
0x7FFFFFFFFFFFFFFF
0xFFFFFFFFFFFFFFFF

2、字符常數
字符常數就是大家通常所寫的'a'、'/n'等等。
在C++0X標準中,除了普通的類型爲char的字符常數之外,還新增了
u'a'
U'a'
L'a'
三種字符常數,它們的類型分別爲char16_t、char32_t和wchar_t

需要注意的是,我們可以在''中指定多個字符,譬如'abcd',這種字符常數稱爲“multicharacter literal”。類型默認爲int,取值取決於具體的實現

轉義字符
轉義字符以/開始,標準支持以下幾種轉義字符(參見2.13.2-3 Table6)
/n、/t、/v、/b、/r、/f、/a、//、/?、/'、/"
以及/ooo和/xhhh
/ooo用於表示八進制數,/後面可以跟1到3個八進制字符(2.13.2-4)
/xhhh用於表示十六進制數,/後面跟x和若干個十六進制字符

3、浮點常數
浮點數如何表示大家可能都很熟悉了。
需要注意的是,不加後綴默認類型爲double,後綴f或者F表示float,後綴l或者L表示long double(2.13.3-1)

4、字符串常數
和字符常數類似,新標準中加入了帶u、U和L前綴的字符串常數(2.13.4-1)

需要注意的是,字符串常數的類型是“array of n const char_type”,具體的char_type取決於前綴。字符串常數位於靜態存儲區。(2.13.4-2~5)
雖然你可以將字符串常數賦給char_type *的指針,但是如果你通過該指針修改字符串常數的話,會導致未知的行爲(2.13.4-6)
下面的程序展示了常見的對字符串常數的誤用:
char *p="hello";
p[0]='a';

同時,包含相同內容的字符串常數是否指向同一塊內存區域是實現相關的,因此下面的判斷是否成立,取決於具體的實現:
if (""=="") printf("The Same");

字符串常數有一個很有趣的屬性,就是相鄰的兩個字符串常數會自動連接,比如"a""b"<==>"ab"(2.13.4-7)
新標準規定,兩個字符串常數如果擁有相同的前綴,就可以自動連接,類型取決於前綴。如果其中一個字符串常數不帶後綴,那麼也可以自動連接,類型取決於另一個帶前綴的字符串常數。其它組合是否支持取決於具體的實現

5、布爾常數
這個最簡單,就true和false兩種(2.13.5-1)
發佈了40 篇原創文章 · 獲贊 5 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章