【C++基础】第七课:字面值常量

字面值,转义序列

Posted by x-jeff on May 13, 2019

【C++基础】系列博客为参考《C++ Primer中文版(第5版)》C++11标准)一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.整型和浮点型字面值

1.1.整型字面值

通常将整型字面值写作十进制数八进制数十六进制数的形式。

  • 以0开头的整数代表八进制数。
  • 以0x或0X开头的代表十六进制数。

例如,数值20的几种表示方法:

  1. 20 (十进制)
  2. 024 (八进制)
  3. 0x14 (十六进制)

整型字面值具体的数据类型由它的【值】【符号】决定。默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。

十进制字面值的类型是intlonglong long中尺寸最小的那个,当然前提是这种类型要能容纳下当前的值。

八进制和十六进制的字面值的类型是能容纳其数值的intunsigned intlongunsigned long long longunsigned long long中尺寸最小者。

如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。

❗️类型short没有对应的字面值。

⚠️尽管整型字面值可以存储在带符号数据类型中,但严格来说,十进制字面值不会是负数。如果我们使用了一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。

1.2.浮点型字面值

浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用$E$或$e$标识:

  • $3.14159$
  • $3.14159E0$
  • $0.$
  • $0e0$
  • $.001$

默认的,浮点型字面值是一个double

2.字符和字符串字面值

  • 由单引号括起来的一个字符称为char型字面值。
  • 双引号括起来的零个或多个字符则构成字符串型字面值。

例如:

1
2
'a' //字符字面值
"hello world!" //字符串字面值

字符串字面值的类型实际上是由常量字符构成的数组(array)

⚠️编译器在每个字符串的结尾处添加一个空字符(‘\0’),因此,字符串字面值的实际长度要比它的内容多1。例如,字面值'A'表示的就是单独的字符A,而字符串"A"则代表了一个字符的数组,该数组包含两个字符:一个是字母A,另一个是空字符。

如果两个字符串字面值位置紧邻且仅由空格缩进换行符分隔,则它们实际上是一个整体。例如:

1
2
cout<<"a really , really long string literal "
      "that spans two lines"<<endl;

输出为:

1
a really , really long string literal that spans two lines

3.转义序列

有两类【字符】程序员不能直接使用:

  1. 不可打印的字符,如退格或其他控制字符,因为它们没有可视的图符。
  2. C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。

这些情况下需要用到转义序列,转义序列均以【反斜线】作为开始,C++语言规定的转义序列包括:

例如:

1
cout<<"\tHi!\n";

输出为:

1
2
	Hi!
	

3.1.泛化的转义序列

泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。假设使用的是Latin-1字符集,以下是一些示例:

⚠️如果反斜线\后面跟着的八进制数字超过了3个,只有前3个数字与\构成转义序列。相反,\x要用到后面跟着的所有数字。

4.布尔字面值和指针字面值

  • truefalse是布尔类型的字面值。
  • nullptr是指针字面值。

5.指定字面值的类型

通过下表中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型:

例如:

1
2
3
4
5
L'a' //宽字符型字面值,类型是wchar_t
u8"hi!" //utf-8字符串字面值(utf-8用8位编码一个Unicode字符)
42ULL //无符号整型字面值,类型是unsigned long long
1E-3F //单精度浮点型字面值,类型是float
3.14159L //扩展精度浮点型字面值,类型是long double

6.设置浮点数精度

1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    float fval1=1.123456789;
    float fval2=0.123456789;
    cout<<setprecision(3)<<fval1<<endl;//输出为1.12
    cout<<setprecision(3)<<fval2<<endl;//输出为0.123
    return 0;
}