目录
---------------------------------------------------------------------------------------------------------------------------------
数据类型
- 基础类型(括号内为代表关键词/代表类型)
- 无类型/
void
型 (void
) - (C++11 起)空指针类型 (
std::nullptr_t
) - 算术类型
- 整数类型 (
int
) - 布尔类型/
bool
型 (bool
) - 字符类型 (
char
) - 浮点类型 (
float
,double
)
- 整数类型 (
- 无类型/
布尔类型
一个 bool
类型的变量取值只可能为两种:true
和 false
。
一般情况下,一个 bool
类型变量占有1字节(一般情况下,1字节 = 8位)的空间。
整数类型
整数类型一般按位宽有 5 个梯度:char
,short
,int
,long
,long long
.
C++ 标准保证 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
由于历史原因,整数类型的位宽有多种流行模型,为解决这一问题,C99/C++11 引入了,定宽整数类。
int
类型的大小
在 C++ 标准中,规定 int
的位数 至少 为16位。
事实上在现在的绝大多数平台,int
的位数均为32位。
对于 int
关键字,可以使用如下修饰关键字进行修饰:
符号性:
signed
:表示带符号整数(默认);unsigned
:表示无符号整数。
大小:
short
:表示 至少16位整数;long
:表示 至少32位整数;- (C++11 起)
long long
:表示 至少64位整数。
字符类型
分为“窄字符类型”和“宽字符类型”,由于算法竞赛几乎不会用到宽字符类型,故此处仅介绍窄字符类型。
窄字符型位数一般为 位,实际上底层存储方式仍然是整数,一般通过 ASCII 编码 实现字符与整数的一一对应,有如下三种:
signed char
:有符号字符表示的类型,表示范围在-128~-127之间。unsigned char
:无符号字符表示的类型,表示范围在0~255之间。-
char
拥有与signed char
或unsigned char
之一相同的表示和对齐,但始终是独立的类型。char
的符号性取决于编译器和目标平台:ARM 和 PowerPC 的默认设置通常没有符号,而 x86 与 x64 的默认设置通常有符号。GCC 可以在编译参数中添加
-fsigned-char
或-funsigned-char
指定将char
视作signed char
或unsigned char
,其他编译器请参照文档。需要注意指定与架构默认值不同的符号有可能会破坏 ABI,造成程序无法正常工作。浮点类型
浮点类型
用于存储“实数”(注意并不是严格意义上的实数,而是实数在一定规则下的近似),包括以下三种:
float
:单精度浮点类型。如果支持就会匹配 IEEE-754 binary32 格式。double
:双精度浮点类型。如果支持就会匹配 IEEE-754 binary64 格式。long double
:扩展精度浮点类型。如果支持就会匹配 IEEE-754 binary128 格式,否则如果支持就会匹配 IEEE-754 binary64 扩展格式,否则匹配某种精度优于 binary64 而值域至少和 binary64 一样好的非 IEEE-754 扩展浮点格式,否则匹配 IEEE-754 binary64 格式。
因为 float
类型表示范围较小,且精度不高,实际应用中常使用 double
类型表示浮点数。
另外,浮点类型可以支持一些特殊值:
- 无穷(正或负):
INFINITY
. - 负零:
-0.0
,例如1.0 / 0.0 == INFINITY
,1.0 / -0.0 == -INFINITY
. - 非数(NaN):
std::nan
,NAN
,一般可以由0.0 / 0.0
之类的运算产生。它与任何值(包括自身)比较都不相等,C++11 后可以 使用std::isnan
判断一个浮点数是不是 NaN.
无类型
void
类型为无类型,与上面几种类型不同的是,不能将一个变量声明为 void
类型。但是函数的返回值允许为 void
类型,表示该函数无返回值。
定义变量
简单地说,定义一个变量,需要包含类型说明符(指明变量的类型),以及要定义的变量名。
例如,下面这几条语句都是变量定义语句。
int a;
double b;
char c = 'c';
常量
常量是固定值,在程序执行期间不会改变。
常量的值在定义后不能被修改。定义时加一个 const
关键字即可。