在前面的初识输入输出中,曾经提到一个概念叫做字符串字面值常量。
形如"enter two numbers:"的值被称为字面会常量,这样的值一望而知。
每个字面值常量对应一种数据类型,字面值常量的形式和值决定了它的数据类型。
整形和浮点型字面值
我们可以将整形字面值写作十进制、十六进制、八进制数的形式。
以0开头的整数代表八进制数,以0x或者0X开头的数代表十六进制数。
看例子:
#include<iostream>
using namespace std;
int main()
{
int a = 20,b = 024,c = 0x14;
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "c:" << c << endl;
return 0;
}
分别输入三种不同进制的整形数,最后所得出书都是一样的都是十进制的20。
运行结果如下:
默认十进制数是无符号的,八进制和十六进制是有符号的。
一个十进制字面值常量的类型,是int、long、long long中可容纳当前字面值常量的尺寸最小的那个。
而一个八进制和十六进制字面值常量的类型,是int、long、long long、unsigned int、unsigned long、unsigned long long中可容纳当前字面值常量的尺寸最小的那个。
字符和字符串字面值
单引号括起来的一个字符是字符型字面值,双引号括起来的是字符串字面值。
字符串字面值的类型实际是由常量字符构成的数组,编译器在每个字符串结尾处添加一个空字符'\0'(空字符和空格是完全不同的两样字符,空格类似于abc是可打印的,而空字
符意味着字符串的结束)。
看例子:
#include<iostream>
using namespace std;
int main()
{
cout << "hello" << ".length=" << strlen("hello") << endl;
cout << "hello" << ".size=" << sizeof("hello") << endl;
return 0;
}
size求出的是字符串字面值所占的内存。
运行结果如下图:
在计算长度的时候,字符串字面值最后的空字符是不算入长度的,所以长度为5。
在计算所占内存大小的时候,空字符是占用了一个字符的内存,所以其大小是6。
有两类字符是程序员无法使用的,一类是不可视的字符,如:退格等。另一类是有特殊含义的字符,如:单引号,双引号等。
c++语言定义的转移语言包括:
换行符 \n
横向制表符 \t
报警符 \a
纵向制表 \v
退格符 \b
双引号 \"
单引号 \'
问号 \?
反斜杠 \\
回车符 \r
进纸符 \f
因为对退格符的概念不是很清楚,对换行符和回车符的概念也不是很清楚,所以写了一个简单的例子。
看例子:
#include<iostream>
using namespace std;
int main()
{
cout << "123456\b\b\b777" << endl;
cout << "123456\b\b\b77" << endl;
cout << "123456\b\b\b7" << endl;
cout << "双引号\"换行符\n回车符\r进纸符\f" << endl;
cout << "回车符\r" << endl;
return 0;
}
在实际的运算中,每一个退格符以为着光标向前移动一次。
如果换行符后面还有字符的话则后面的字符会把退格后光标后面的字符覆盖掉。
回车符的作用是把光标移动到本行的首位,如果回车符后面有字符,则会覆盖掉首位后面的字符。
换行符的意义就是单纯的换到下一行。
我们也可以使用泛化的转义字符
其形式是\+加八进制数或者\x+十六进制数提供一些示例:
\7(响铃) \12(换行符) \40(空格)
\0(空字符) \115(M) |x4d(字符M)
如果使用的是asc码字符集,则将反斜杠后面的值换算成相应的十进制,然后可以对照asc码表就可以知道其代表的值了。
做了一个简单的例子,看代码:
#include<iostream>
using namespace std;
int main()
{
cout << "Hi \x4dO\115!\n" << endl;
return 0;
}
结果如下图:
指定字面值的类型
通过添加如下表中的前缀或者后缀,可以改变整形、浮点型和字符型字面值常量的默认类型。
字符和字符串字面值
前缀 含义 类型
u Unicode16 cahr16_t
U Unicode32 cahr32_t
L 宽字符 wchar_t
u8 UTF_8(仅用于字符串字面值常量) cahr
整形
后缀 最小匹配类型类型
u或U unsigned
l或L long
ll或LL long long
浮点型 类型
f或F float
l或L long Double
看例子:
L'a' 宽字符类型字面值
u8"hi!" utf-8字符串字面值
42ull 整形字面值 unsigned long long类型
1E-3F 浮点型字面值,float类型
3.14159L 浮点型字面值,long double类型