C++字面量
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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进制的字⾯量也不适⽤.
对于其后跟随的表达式,⼀组记号不含有空格分割,则会对其进⾏最⼤程度的表达式匹配,那么如果⽤户定义字⾯量后的标识符后跟随加减等符号,不含空格分割,则会对其进⾏匹配从⽽导致⾮法数字记号的产⽣.
字⾯量的后缀有限于所有⽤户定义字⾯量匹配,这也得益于最⼤吞噬原则
同样,得益于最⼤吞噬原则,⽤户定义字⾯量的标识符会被处理为⼀个记号,这就使得,如果其后的标识符为⼀个宏,但是其间⼜⽆分隔,那么此时就会匹配⽤户定义字⾯量函数,若匹配不到,则为病式。