返回目錄
c++0x支援以下7種型別的常數(其中後兩種是c++0x新增的):
整型常數
字元常數
浮點常數
字串常數
布林常數
指標常數
自定義常數
1、整型常數(注:因為long long是c++0x才正式加入的,所以目前不同的編譯器對它的支援和標準的描述還有些出入)
有三類整型常數:
十進位制,以1~9開頭
八進位制,以0開頭
十六進製制,以0x或者0x開頭
你可以在整型常數後面加上字尾來明確它的型別(2.13.1-2):
注意,u和l的位置可以互換,所以ul和lu都是可以的。(但是目前vc還不支援llu,只支援ull)
看看你是不是能正確說出下面這些整型常數的型別?11u
1lu1ull
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',這種稱為多字元常數。型別預設為int,取值取決於具體的實現
轉義字元以/開始,標準支援以下幾種轉義字元(參見2.13.2 table6)
/n、/t、/v、/b、/r、/f、/a、//、/?、/'、/"以及/ooo和/xhhh
/ooo用於表示八進位制數,/後面可以跟1到3個八進位制字元(2.13.2-4)。/xhhh用於表示十六進製制數,/後面跟x和若干個十六進製制字元
3、浮點常數
浮點數如何表示大家可能都很熟悉了。
如果指定的浮點數無法用相應的型別精確表達,那麼實現可以自由選擇較大或者較小的最接近的數替代。如果浮點數太大超出了可以表示的範圍,那麼程式是ill-formed
需要注意的是,不加字尾預設型別為double,字尾f或者f表示float,字尾l或者l表示long double(2.13.3-1)
4、字串常數
和字元常數類似,新標準中加入了帶u8、u、u和l字首的字串常數,以及帶r、u8r、ur、ur和lr的可以遮蔽轉義的字串常數(2.13.4-1)
需要注意的是,字串常數的型別是「array of n const char_type」,具體的char_type取決於字首(其中u8字首的char_type仍然是char,不過字串將採用utf8編碼)。字串常數字於靜態儲存區。(2.13.4-6~9)
雖然你可以將字串常數賦給char_type *的指標,但是如果你通過該指標修改字串常數的話,會導致未知的行為。下面的程式展示了常見的對字串常數的誤用:
char *p="hello";
p[0]='a';
在早期的vc中,"hello"存放在.data段裡,因此上面的**不會導致執行期錯誤。但是現在的vc會將"hello"存放在.rdata段裡。這個段是唯讀的,因此上面的**就會出錯。
同時,包含相同內容的字串常數是否指向同一塊記憶體區域是實現相關的,因此下面的判斷是否成立,取決於具體的實現:
if (""=="") printf("the same");
字串常數有乙個很有趣的屬性,就是相鄰的兩個字串常數會自動連線,比如"a""b"<==>"ab"(2.13.4-10)
新標準規定,兩個字串常數如果擁有相同的字首,就可以自動連線,型別取決於字首。如果其中乙個字串常數不帶字尾,那麼也可以自動連線,型別取決於另乙個帶字首的字串常數。其它組合是否支援取決於具體的實現。而c++03中,只允許相同的字首進行自動連線(gcc有擴充套件,可以支援窄字串和寬字串的自動連線)
注:u8字首不能和寬字串相鄰
5、布林常數
這個很簡單,就true和false兩種(2.13.5-1)
6、指標常數
這個最簡單,只有乙個:nullptr。用於代替null的作用。它的型別是std::nullptr_t(2.13.6-1)
7、自定義常數
目前沒有編譯器支援,這裡就不介紹了
《C 0x漫談》系列
05年開始關注c 0x,其時c 0x的大部分草案其實都已經初具雛形。但幾個重大的特性 concepts,rvalue,memory model,variadic templates等都還在激烈的動盪當中。於是一路看著這些特性不斷成長,不斷出revisions。其間也跟標準委員會中的一些大牛們,如pe...
《C 0x漫談》系列
05年開始關注c 0x,其時c 0x的大部分草案其實都已經初具雛形。但幾個重大的特性 concepts,rvalue,memory model,variadic templates等都還在激烈的動盪當中。於是一路看著這些特性不斷成長,不斷出revisions。其間也跟標準委員會中的一些大牛們,如pe...
標準草案叫做C 0x
此後,新的標準草案叫做c 0x。對於c 0x標準草案的最終國際投票已於2011年8月10日結束,並且所有國家都投出了贊成票,c 0x已經毫無疑義地成為正式國際標準。先前被臨時命名為c 0x的新標準正式定名為iso iec 14882 2011,簡稱iso c 11標準。c 11標準將取代現行的c 標...