C 0x導讀 2 13 常數

2021-04-24 18:01:36 字數 2243 閱讀 7546

返回目錄

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 標...