C++ 学习笔记
一、变量和基本类型概述
类型是所有程序的基础。类型告诉我们数据代表什么意思以及可以对数据执行哪些操作。
c++基本类型:
- 字符型
- 整型
- 浮点型
c++ 还提供了可用于自定义数据类型的机制,标准库正式利用了这些机制定义了许多更复杂的类型,比如可变长字符串string 和vector等。此外,我们还能修改已有的类型以形成复合类型。
二、基本内置类型
- 算数类型:表示整数、浮点数、单个字符和布尔值的类型。
- void类型:void类型没有对应的值,仅用在有限的一些情况下,通常用作无返回值函数的返回类型。
下面详细介绍。
类型 | 含义 | 最小存储空间 |
---|---|---|
bool | 布尔型 | - |
char | 字符型 | 8位 |
wchar | 宽字符型 | 16位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
算数类型的存储空间依机器而定。这里的存储空间是指用来表示该类型的二进制位(bit)数。C++ 标准规定了每个算数类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。
注: 因为位数的不同,这些类型的所能表示的最大(最小)值也因机器的不同而有所不同。
2.1 整型:
表示整数、字符和布尔值的算数类型合成为整型 (integral type)
2.1.1 分类
整型按细分类型分为以下几个:
整数
a. short: 一般为半个机器字(word)长
b. int: 为一个机器字长
c. long: 为一个或两个机器字长
字符
a. char: 保证了有足够的空间,能够存储机器基本字符集中任何字符相应的值,因此char类型通常是单个机器字节(byte)
b. wchar_t: 用于扩展字符集,比如汉字和日语,这些字符集中的一些字符不能用单个char表示
布尔值
a. true: 任何非零的值都代表true
b. false: 0代表false
整型按是否带符号分为带符号和无符号类型:
- 带符号的(signed):可表示整数也可以表示负数(包括0)
- 无符号的(unsigned):只能表示大于或等于0的数
注:整型 int、short、long都默认为带符号型。要获得无符号型则必须指定该类型为unsigned,比如unsigned long。unsigned int 类型可以简写为unsigned,也就是说,unsigned后不加其他类型说明符意味着是 unsigned int。
char有三种不同的类型:普通char、unsigned char 和 signed char,虽然char有三种不同的类型,但是只有两种表示方式。可以使用unsigned char 或 signed char 表示 char 类型。
2.1.2 整型值的表示
无符号型中,所有的位都表示数值。如果在某种机器中,定义一种类型使用8位表示,那么这种类型的unsigned 型可以取值 0 到 255。
表示signed 整型类型最常见的策略是用其中一个位作为符号位。符号位为1,值就为负数;符号位为0,值就为0或正数。 一个使用一位符号位的表示方式的8位signed整型取值是从 -128 到 127。
2.1.3 整型的赋值
对象的类型决定对象的赋值。那当我们试着把一个超出其取值范围的值赋给一个指定类型的对象时,结果哦取决于这种类型是 signed 还是unsigned 的。
--- 对于 unsigned 类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对unsigned 类型的可能取值数目求模,然后取所得值。另外对于unsigned 类型来说,负数总是超出其取值范围。unsigned 类型的对象可能永远不会保存负数。有些语言中将负数赋给unsigned 类型是非法的,但在C++ 中这是合法的,其结果是该负数对该类型的取值个数求模后的值。
--- 对于signed 类型来说,当将超过取值范围的值赋给signed 类型时,由编译器决定实际赋的值。
2.2 浮点型
类型 float 、double、long double 分别表示单精度浮点数,双精度浮点数和扩展精度浮点数。一般 float 类型用一个字(32位)来表示,double用两个字(64位)来表示,long double类型用三个或四个字(96或 128 位)来表示。类型的取值范围决定了浮点数所含的有效数字位数。
3. 字面值常量
像42 这样的值,在程序中被当做 字面值常量( literal constant),称之为字面值是因为只能用它的值来称呼它,称之为常量是因为它的值不能被修改。每个字面值都有相应的类型,例如: 0 是 int 型, 3.14159 是double 型。只有内置类型存在字面值,没有类类型的字面值。因此,也没有任何标准库类型的字面值。
3.1 整型字面值规则
定义字面值整数常量可以使用以下三种进制中的任一种:十进制、八进制和十六进制。当然这些进制不会改变其二进制位的表示形式。例如我们将值20定义成下列三种形式中的任意一种:
20 // decimal
024 // octal
0x14 // hexadecimal
字面值整数常量的类型默认为 int 或 long 类型。其精度类型决定于字面值 —— 其值适合 int 就是 int 类型,比 int 大的值就是 long 类型。
通过增加后缀,能够强制将字面值整数常量转换为 long 、unsigned 、或unsigned long 类型。通过在数值后边加 L 或者 l ,指定常量为 long 类型。(注:定义长整型时,应该使用大写字母L,避免混淆)
类似的,可以通过在数值后边加 U 或者u 定义 unsigned 类型。同时加 L 和 U 就能得到unsigned long 类型的字面值常量,但其后缀之间不能有空格。
例如:
128u // unsigned 1L // long
1024UL // unsigned long 8Lu // unsigned long
3.2 浮点字面值规则
通常可以用十进制或者科学计数法来表示浮点字面值常量。使用科学计数法时,指数用 E或 e 表示。默认的浮点字面值常量为 double 类型。在数值的后面加上 f 或 F 表示单精度。同样加上 L 或者 l 表示扩展精度。
3.3 非打印字符的转义序列
比如退格或控制符,还有一些在语言中有特殊意义的字符,比如单双引号、反斜线符号。不可打印字符和特殊字符都用转义字符书写。转义字符都以反斜线符号开始。
3.4 字符串字面值
字符串字面值常量用双引号括起来的零个或者多个字符表示。不可打印字符表示成相应的转义字符。
为了兼容C语言,C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符。
字符串字面值的连接:两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。
3.5 多行字面值
在一行的末尾加一反斜线符号可将此行和下一行当做同一行处理。