整型字面值常量
形如5、100等这样子的数被称为整型字面值常量
我们可以把整型字面值写作十进制数,八进制数或者十六进制数的形式。
以0开头的整数代表八进制数,以0x或者0X开头的表示十六进制数。
例如我们可以使用下面的任意一种形式来表示数值20;
20//十进制
020//八进制
0x20//十六进制
c++把十进制整数字面值存储为int,long,long long中尺寸中最小的那个,前提是要容纳的下当前的值。
八进制和十六进制整数字面值是能容纳其数值的int,unsigned int,long,unsigned long,long long和unsigned long long类型(前提是编译器能识别这些类型)当中的尺寸最小者
我们不免会在程序中使用整数常量,就像下面一样
1111111111111 /*编译器先将这个数存为int,发现不够大,
改存为long,发现还不够大,再改为long long*/
例子
int a=10000000000000;
编译器将这个数字存为int,发现不够存,long ,再依次类推,直到存下这个数据的类型,假设这个数字被存为long,它被赋给int类型时就会直接截断成int类型的精度。
后缀:
不过上面这样子一个个匹配类型的话会减慢程序运行速度,最好的做法就是直接指明整型常量的存储方式,我们就可以通过后缀来指定具体的类型
整数常量的存储方式还可以通过使用后缀来指定具体的类型。
常见的后缀包括u或者U表示无符号整数、l或者L表示长整数,ll或者LL表示长长整数。例如,常量10u表示无符号整数类型的10,常量1000000000l表示长整数类型的1000000000。
注意
尽管整型字面值可以存储在带符号数据类型中,但是严格来说,十进制字面值不会是负数。如果我们使用了一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
浮点型字面值
浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分使用E或者e标识。
如下面
3.14 4.2E0 0.
0e0 .001
浮点型字面值默认为double类型
后缀
我们可以在浮点数后面加入后缀f或者F可覆盖默认设置,编译器会将浮点型常量看作float类型进行存储。比如
2.3f;
3.4F;
这两个数都会被存储为float类型。
同理的还有后缀l和L,它们可使浮点型常量成为long double类型
比如
2.3l;
3.4L;
这两个都会被存为long double类型
字符和字符串字面值
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则将构成字符串型字面值。
'a' //字符字面值 认类
"Heilo Norid!"// 字符串字面值
字符串字面值的类型实际上是由常量字符构成的数组。编译器在每个字符串的结尾处添加一个空字符('\0’),因此,字符串字面值的实际长度要比它的内容多1。
例如,字面值A”表示的就是单独的字符A,而字符串“a”则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。
如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。当书写的字符串字面值比较长,写在一行里不太合适时,就可以采取分开书写的方式:
std::cout << "a really, really long string literal"
"that spans two lines"<< std::endl;
这和下面这个是等价的
std::cout << "a really, really long string literal that spans two lines"<< std::endl;
转义序列
有两类字符程序员不能直接使用:
一类是不可打印的字符,如退格或其他控制字符,因为它们没有可视的图符;
另一类是在C+语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。
在这些情况下需要用到转义序列(escape sequence),转义序列均以反斜线作为开始,C++语言规定的转义序列包括:
换行符\n
横向制表符\t
报警(响铃)符\a
纵向制表符\v
退格符\b
反斜线\\
双引号\"
问号\?
回车符\r
进纸符\f
单引号 \'
在程序中,上述转义序列被当作一个字符使用:
std::cout << "\n'; //转到新一行
std::cout << "\tHi!\n"; // 输出一个制表符,输出"Hi!”,转到新一行
\xxx和\xdd
我们也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。假设使用的是Latin-1字符集,以下是一些示例:
\7(响铃) \12(换行符) \40(空格)
\0(空字符) \115(字符M) \x4d(字符M)
我们可以像使用普通字符那样使用C++语言定义的转义序列:
std::cout <<'\115' <<'\n'; //输出 M,转到新一行
注意,如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。
例如,“\1234”表示2个字符,即八进制数123对应的字符以及字符4。
相反,\x后面跟着的所有十六进制数字都构成同一个转义序列。
例如,“\x1234”表示一个16位的字符,该字符由这4个十六进制数所对应的比特唯一确定。因为大多数机器的char型数据占8位,所以上面这个例子可能会报错。一般来说,超过8位的十六进制字符都是与某个前缀作为开头的扩展字符集一起使用的。
指定字面值的类型
通过添加如表中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。
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 |
整型字面值
后缀 | 最小匹配类型 |
u或者U | unsigned |
l或者L | long |
ll或者LL | long long |
浮点型字面值
后缀 | 类型 |
f或者F | float |
l或者L | long double |
对于一个整型字面值来说,我们能分别指定它是否带符号以及占用多少空间。如果后缀中有U,则该字面值属于无符号类型,也就是说,以u为后缀的十进制数、八进制数或十六进制数都将从unsigned int、unsigned long和unsigned long long中选择能匹配的空间最小的一个作为其数据类型。
如果后缀中有L,则字面值的类型至少是long;如果后缀中有LL,则字面值的类型将是long long和unsigned long long中的一种。显然我们可以将U与L或LL合在一起使用。例如,以UL为后缀的字面值的数据类型将根据具体数值情况或者取unsigned long,或者取unsigned long long。
布尔字面值和指针字面值
true和false是布尔类型的字面值:
bool test = false;
nullptr是指针的字面值
int*a=nullptr;