C++ 字面量


字面量

字面量是在C/C++程序中直接可以用作表達式操作數的量,其不需要額外的對象來對其地址或值進行保存(通常,用戶定義字面量除外)

  • 字面量寶括:
    • 整數字面量
    • 浮點數字面量
    • 字符字面量
    • 字符串字面量
    • bool字面量
    • 用戶定義字面量

整數字面量

整數字面量可以直接作為運算數的參與運算(整數字面量自C++17起引入二進制表示,所以當前整數字面量可以有二八十十六進制)

  • 整數字面量應該有如下規定:

    • 以0開頭的為特殊

      • 之后直接為8進制數序列(0~8)的,則為合法的8進制數,否則為病式
      • 之后為x(大小寫均可)的,則之后應該是16進制數序列(0~F)大小寫均可,否則為病式
      • 之后為b(大小寫均可)的,則之后應該是2進制數序列(0~1),否則為病式
    • 或以十進制數為序列的
    • 在以上均正確之后,要求整數數值范圍在目前規定(包含編譯器擴充)的所有整數類型的至少一個的范圍內,則其值才為正確.
    • 整數字面量后可以加后綴來修飾當前字面量的類型,但是注意有以下兩組可供排列組合來選擇:
    U(u) L(l) LL(ll)

    其中要注意格式,即不可以存在Ll的形式.

浮點數字面量

浮點數字面量同整數作用類似(浮點數字面量有十,十六兩進制表示)

  • 浮點數字面量應該有如下規定:

    • 浮點數字面量一共有三種形式
      在C++ 17后擁有16進制浮點數表示法
      這里簡單概括為:0x(可選) 數字序列 指數(可選)
    數字序列 指數
    滿足開頭可選的進制表示集合(未選擇則表示十進制),並可選的包含零或一個(至多一個).(小數點) 當可選的進制表示選中,則指數部分為p(可大寫)並表示以2為底的指數(並且,必須包含此項),未選,則指數部分為E(可小寫)並表示以10為底的指數
    注,指數后的數字只能是十進制,可正可負

    16進制浮點數實際上計算方式和二進制一樣:0.x1 x2 ... xn => 16-1 * x1 + 16-2 * x2 + 16-n * xn

字符字面量

字符字面量由一個前綴(可選)和一對''包括,其中''可以是一個字符串序列,但是這個字符串序列必須服從以下基本要求:

  • 為一個非\的字符
  • 若為\開頭的字符則要滿足轉義字符的相關規定,並且范圍復合前綴規定
  • 若為多個非\字符,則為int型,其數值是實現定義\

字符串字面量

字符串字面量是由一個前綴和一對""其中包括一切正確的字符和轉義字符組成其中有如下性質:

  • 兩個向鄰且之間無任何空白字符外的同基礎字符類型字符串會在翻譯階段被整合為一整個,若基礎類型不同,則為病式
  • 由於翻譯階段的貪婪原則,如果以宏替換一個字符串,則兩字符串之間必須有空白字符隔開,否則對其有限匹配用戶定義字面量函數,若沒有,則為病式
  • 對於raw(未處理的)字符串字面量是形式是R"定界()定界",其中定界是可選的,因為默認()是一對定界符,這里的額外的定界是為了標記定界括號用的,例如:
    char str[] = R"((123)")";
    
    上面的由於無定界符所以在123后面的)"會被當作字符串結尾,但是存在定界符:
    char str[] = R"...((123)")...";
    
    此時未出理的字符串內容就是(123)"了,因為標記范圍已經明確.

用戶定義字面量

用戶定義字面量是在原字面量的基礎上新增的,用於修飾原字面量從而創建某一類新的對象(通常),來提高程序的可讀性的一個優化性質的函數調用.

  • 字面量函數
    • 字面量函數通常是由:返回值類型 operator"" _標識符(參數列表)或返回值類型 operator""關鍵字(參數列表) 聲明的一個特殊的函數
    • 該函數在當字面量后隨一個標識符(無空格的情況下,最大吞噬原則優先),進行無限定查找,查找到相關函數后調用,若查找不到,則為病式.
    • 對於以上四種字面量(浮點,整數,字符,字符串),查找的是long double unsigned long long 和 char(char有多種,對於wchar,char8,16,32,均有),對於字符串則是調用(str,len)形式的函數,即字符指針const char *(char同字符一致,有多種),size_t 用於接收字符長度,即用戶定義字面量函數只能是以上參數類型.
    • 如果以上參數對應的類型,不存在,則有限匹配參數為const char*為參數類型的函數,將以上參數(整數,浮點數)轉換為字符串的形式傳入.
    • 否則,匹配以char為模板元類型的參數包的數值字面量運算符模板,其中模板參數包的內容是將整數或浮點數拆為單獨的一個字符一個字符的傳入.
    • 用戶定義字面量函數第一個,其必須以下划線開頭,可選的以空格分割(標識符與""之間),對於第二種形式,由於是關鍵字,若於""之間存在分割,則單獨處理為關鍵字而非一個整體,會導致病式.
  • 注意事項:
    • 對於整數,浮點數而言,整數可以使用16,8進制的字面量,但是二進制的字面量目前還不適用,浮點數16進制的字面量也不適用.
    • 對於其后跟隨的表達式,一組記號不含有空格分割,則會對其進行最大程度的表達式匹配,那么如果用戶定義字面量后的標識符后跟隨加減等符號,不含空格分割,則會對其進行匹配從而導致非法數字記號的產生.
    • 字面量的后綴有限於所有用戶定義字面量匹配,這也得益於最大吞噬原則
    • 同樣,得益於最大吞噬原則,用戶定義字面量的標識符會被處理為一個記號,這就使得,如果其后的標識符為一個宏,但是其間又無分隔,那么此時就會匹配用戶定義字面量函數,若匹配不到,則為病式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM