一个比如42的值被称作为字面值常量(literal)。每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。
整数型字面值可以写作十进制,八进制或十六进制。其中以0开头的整数代表八进制,以0x或0X开头的代表十六进制数。
比如:
//用任意一种形式来表示数字20
20 //十进制
024 //八进制
0x14 //十六进制
整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制是带符号数的,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
ps:需要注意如果一个字面值连与之关联的最大数据类型都放不下,那么将会产生错误。
虽然整数字面值可以存储带符号都数据类型中,严格来说,十进制字面值不会是负数。假设我们使用了-42的负十进制字面值,那个符号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
浮点字面值表现为一个小数或科学计数法表示的指数,其中指数部分用e或E标识:
3.14159
3.14159E0
0.
0e0
.001
默认浮点型字面值是一个double
有两类字符编写中不能直接使用分别是:
1.不可打印的字符,比如退格或其他控制字符,因为他们没有可视的字符。
2.在C++语言中含有特殊含义的字符(单引号,双引号,问号,反斜线)。
这些情况下需要使用转义序列(escape sequence),转义序列均以反斜线作为开始。
C++规定的转义序列包括:
换行符 \n 横向制表符 \t 报警符 \a
纵向制表符 \v 退格符 \b 双引号 \"
反斜线 \\ 问号 \? 单引号 \'
回车符 \r 进纸符 \f
cout<<'\n'; //转到新一行
cout<<"\tHi!\n"; //输出一个制表符,输出“Hi!",转到新一行
也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个,2个或3个八进制数字,其中数字部分表示的是字符对应的数值。
假设使用Latin-1字符集,比如:
\7(响铃) \12(换行符) \40(空格)
\0(空字符) \115(字符M) \x4d(字符M)
当然也可以像普通字符那样使用C++定义的转义序列:
#include
using namespace std;
int main(void)
{
cout<<"Hi \x4dO\115!\n"; //输出Hi MOM!,转到新一行
cout<<'\115'<<'\n'; //输出M,转到新一行
return 0;
}
上述代码输出如下:
Hi MOM!
M
注意:如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。例如,“\1234"表示2个字符,即八进制数123对应的字符以及字符4。相反,\x要用到后面跟着所有的数字,例如,“\x1234“表示一个16位的字符,该字符由这4个十六进制数所对应的比特唯一确定。不过大部分机器char型数据占8位,所以上面这个例子可能会报错。一般来说,超过8位的十六进制字符都是与某个前缀作为开头的扩展字符集一起使用的。
可以使用下列的前缀和后缀改变整型,浮点型和字符型字面值的默认类型:
字符和字符串字面值
前缀 含义 类型
u Unicode16字符 char16_t
U Unicode32字符 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
//当使用一个长整型字面值时,建议使用大写字母L来标记,因为小写字母l和数字1太容易混淆了。
具体使用代码如下:
#include
using namespace std;
int main(void)
{
//cout<<"Hi \x4dO\115!\n";
cout<<L'a'<<endl; //宽字符型字面值,类型时wchar_t
cout<<u8"hi!"<<endl; //utf-8字符串字面值
cout<<42ULL<<endl; //无符号整型字面值,类型是unsigned long long
cout<<1E-3F<<endl; //单精度浮点型字面值,类型是float
cout<<3.14159L<<endl; //扩展精度浮点型字面值,类型是long double
return 0;
}
代码输出如下:
97
hi!
42
0.001
3.14159
对于一个整型字面值来说,我们可以分别指定它是否带符号以及占用多少空间。比如后缀带有U,则该字面值属于无符号类型,那么他会从unsigned int,unsigned long选择能匹配的空间最小的一个作为其数据类型。如果后缀带有L,则字面值的类型最少是long。不过我们也可以将U和L或LL合在一起使用。比如UL为后缀的字面值的数据类型将根据数据情况或者取unsigned long或unsigned long long。
true和false是布尔类型字面值:
bool test = false; //布尔类型字面值
int *p = nullptr; //nullptr是指针字面值
由单引号扣号起来的一个字符称为char型字面值,双引号括起来的的零个或多个字符则构成字符串字面值。
'a' //字符字面值
"Hello World" //字符串字面值
字符串字面值的类型实际上是由常量字符构成的数组(array),编译器在每个字符串的结尾添加一个空字符(’\0’),因此字符串字面值的长度要比它的内容多1。例如,字面值’A’表示的就是单独的字符A,而字符串"A"则代表一个字符的数组,该数组包含两个字符:一个是字母A,另一个是空字符。
ps:如果书写的字符串字面值比较长,写在一行不太合适时,可以采取分开书写的方式:
#include
using namespace std;
int main(void)
{
//分多行书写的字符串字面值
cout<<"a reallay,a reallay,a reallay"
"b reallay,b reallay,b reallay"<<endl;
return 0;
代码输出如下:
a reallay,a reallay,a reallayb reallay,b reallay,b reallay
1.字面值常量是什么?->一个形如42的值被称作为字面值常量。
2.什么决定来字面值数据类型?->字面值常量的形式和值决定了它的数据类型。
3.整型字面值可以分别使用十进制,八进制或十六进制来表示。整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值是带符号数,八进制和十六进制可以带符号或无符号。
4.如果一个字面值与之关联的最大数据类型都放不下,将产生错误。
5.默认的浮点型字面值是一个double。
6.字符和字符串字面值的表示方法->字符用单引号表示,字符串用双引号表示。
7.字符串字面值的类型是由常量字符构成的数组,编译器在每个字符串的结尾添加一个空字符,因此要比实际长度多1。
8.转义序列均以反斜线作为开始。