79.C++ 中的字面值常量
Posted codemagiciant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了79.C++ 中的字面值常量相关的知识,希望对你有一定的参考价值。
一个形如42的值被称作字面值常量(literal),这样的值一望而知。每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。
1.整型和浮点型字面值
可以将整型字面值写作十进制数、八进制数或十六进制数的形式。以0开头的整数代表八进制数,以0x或0X开头的代表十六进制数。例如,我们能用下面的任意一种形式来表示数值20:
20/*十进制*/ 024/*八进制*/ Ox14/*十六进制*/
整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值是带符号数, 八进制和十六进制字面值既可能是带符号的也可能是无符号的。十进制字面值的类型是int、long和long long中尺寸最小的那个(例如,三者当中最小是int),当然前提是这种类型要能容纳下当前的值。八进制和十六进制字面值的类型是能容纳其数值的 int、unsigned int、long、unsigned long、long long和unsigned long long 中的尺寸最小者。如果个字面值连与之关联的最大的数据类型都放不下,将产生错误。类型short没有对应的字面值。在表1中,以后缀代表相应的字面值类型。
尽管整型字面值可以存储在带符号数据类型中,但严格来说,十进制字面值不会是负数。如果我们使用了一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:
3.14159 3.14159E0 0. 0e0 .001
2.字符和字符串字面值
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。
\'a\' //字符字面值
"Hello world!" //字符串字面值
字符串字面值的类型实际上是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符(\'\\0\'),因此,字符串字面值的实际长度要比它的内容多1。例如,字面值\'A\'表示的就是单独的字符A,而字符串"A"则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一 个整体。当书写的字符串字面值比较长,写在一行里不太合适时,就可以采取分开书写的方式:
//分多行书写的字符串字面值
std::cout << "a really, really long string literal"
"that spans two lines" << std::endl;
3.转义序列
有两类字符程序员不能直接使用:一类是不可打印(nonprintable)的字符,如退格或其他控制字符,因为它们没有可视的图符;另一类是在C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。在这些情况下需要用到转义序列(escape sequence),转义序列均以反斜线作为开始,C++语言规定的转义序列包括:
换行符:\\n 横向制表符:\\t 报警(响铃):\\a
纵向制表符:\\v 退格符:\\b 双引号:\\”
反斜线:\\\\ 问号:\\? 单引号:\\’
回车符:\\r 进纸符:\\f
在程序中,上述转义序列被当作一个字符使用:
也可以使用泛化的转义序列,其形式是\\x后紧跟l个或多个十六进制数字,或者\后 紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。假设使用的是Latin-1字符集,以下是一些示例:
\\7 (响铃) \\12(换行符) \\40(空格)
\\0(空字符) \\115(字符M) \\x4d(字符M)
注意,如果反斜线\\后面跟着的八进制数字超过3个,只有前3个数字与\\构成转义序列。例如, ”\\1234 ”表示2个字符, 即八进制数123对应的字符以及字符4。 相反,\\x要用 到后面跟着的所有数字,例如, ”\\x1234 ”表示一个16位的字符,该字符由这4个十进制数所对应的比特唯一确定。 一般来说, 超过8位的十六进制字符都是与表1中某个前缀作为开头的扩展字符集一起使用的。
4.指定字面值的类型
通过添加如表1中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。
L\'a\' //宽字符型字面值,类型是wchar_t
u8"hi!" //utf-8字符串字面值(utf-8用8位编码一个Unicode字符)
42ULL //无符号整型字面值,类型是unsigned long long
1E-3F //单精度浮点型字面值,类型是float
3.14159L //扩展精度浮点型字面值,类型是long double
建议:当使用一个长整型字面值时,请使用大写字母L未标记,因为小写字母l和数字1太容易混淆了。
加前缀u Unicode 16 字符 char16_t类型
加前缀U Unicode 32 字符 char32_t类型
加前缀L 宽字符 wchar_t类型
加前缀u8 utf-8字符(仅用于字符串字面值常量) char类型(8位编码一个Unicode字符)
表2.2指定字面值的类型
字符和字符串字面值 | ||
前缀 | 含义 | 类型 |
u | Unicode 16字符 | char16_t |
U | Unicode 32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
整型字面值 | 浮点型字面值 | ||
后缀 | 最小匹配类型 | 后缀 | 类型 |
u or U | unsigned | f或F | float |
l or L | long | l或L | long double |
ll or LL | long long |
5.布尔字面值和指针字面值
true和false是布尔类型的字面值:
bool test = false;
nullptr是指针字面值
参考资料:
C++Primer
常说的字面值
字面量
字面量是在源码中一个固定值的表示方法,通俗来说,就是字面量表示如何表达这个值。
数字字面量:8,9,10 *
字符串面量:‘黑马程序员’,“大前端” * 布尔字面量:true,false
<script>
console.log(18);
console.log(18);
console.log(true);
console.log(undefined);
console.log(null);
</script>
以上是关于79.C++ 中的字面值常量的主要内容,如果未能解决你的问题,请参考以下文章