C++ 字面量

字面量

字面量是在C/C++程序中直接可以用作表达式操作数的量,其不需要额外的对象来对其地址或值进行保存(通常,用户定义字面量除外)

  • 字面量宝括:
    • 整数字面量
    • 浮点数字面量
    • 字符字面量
    • 字符串字面量
    • bool字面量
    • 用户定义字面量

      整数字面量

      整数字面量可以直接作为运算数的参与运算(整数字面量自C++17起引入二进制表示,所以当前整数字面量可以有二八十十六进制)
  • 整数字面量应该有如下规定:
    • 以0开头的为特殊
      • 之后直接为8进制数序列(0~8)的,则为合法的8进制数,否则为病式
      • 之后为x(大小写均可)的,则之后应该是16进制数序列(0~F)大小写均可,否则为病式
      • 之后为b(大小写均可)的,则之后应该是2进制数序列(0~1),否则为病式
    • 或以十进制数为序列的
    • 在以上均正确之后,要求整数数值范围在目前规定(包含编译器扩充)的所有整数类型的至少一个的范围内,则其值才为正确.
    • 整数字面量后可以加后缀来修饰当前字面量的类型,但是注意有以下两组可供排列组合来选择:

        其中要注意格式,即不可以存在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进制的字面量也不适用.
    • 对于其后跟随的表达式,一组记号不含有空格分割,则会对其进行最大程度的表达式匹配,那么如果用户定义字面量后的标识符后跟随加减等符号,不含空格分割,则会对其进行匹配从而导致非法数字记号的产生.
    • 字面量的后缀有限于所有用户定义字面量匹配,这也得益于最大吞噬原则
    • 同样,得益于最大吞噬原则,用户定义字面量的标识符会被处理为一个记号,这就使得,如果其后的标识符为一个宏,但是其间又无分隔,那么此时就会匹配用户定义字面量函数,若匹配不到,则为病式

转载于:https://www.cnblogs.com/A001/p/10443811.html

你可能感兴趣的:(C++ 字面量)