1. 算数类型
类型 | 位 | 范围 |
---|---|---|
char | 1 个字节 | -128 到 127 或者 0 到 255 |
col 2 is | centered | $12 |
unsigned char | 1 个字节 | 0 到 255 |
signed char | 1 个字节 | -128 到 127 |
int | 4 个字节 | -2147483648 到 2147483647 |
unsigned int | 4 个字节 | 0 到 4294967295 |
signed int | 4 个字节 | -2147483648 到 2147483647 |
short int | 2 个字节 | -32768 到 32767 |
unsigned short int | 2 个字节 | 0 到 65,535 |
signed short int | 2 个字节 | -32768 到 32767 |
long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long int | 8 个字节 | 0 to 18,446,744,073,709,551,615 |
float | 4 个字节 | +/- 3.4e +/- 38 (~7 个数字) |
double | 8 个字节 | +/- 1.7e +/- 308 (~15 个数字) |
long double | 8 个字节 | +/- 1.7e +/- 308 (~15 个数字) |
wchar_t | 2 或 4 个字节 | 1 个宽字符 |
2.字符串的前后缀:
前缀 | 意义 |
---|---|
u | unicode16字符 |
U | unicode32字符 |
L | 宽字符 |
u8 | utf-8 |
后缀 | 意义 |
---|---|
u或U | 表示该字面值为无符号类型 |
l或L | 表示该字面值的类型至少为long |
ll或LL | 表示该字面值的类型至少为long long |
f或F | 表示该字面值为float类型 |
前后缀可以交叉结合使用:后缀UL时,表示无符号长整型。
字符用单引号‘’,字符串用双引号“”。
十进制:20 八进制:020 十六进制:0x20或者0X20
3.类型转换
- 当我们把一个非布尔类型的算术值赋给布尔类型时,初始值为0则结果为false,否则结果为true。
- 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1。
- 当我们把一个浮点数赋给整数类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。
- 当我们把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
- 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255。
- 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。
4.变量
- 命名规则:字母+数字+下划线(必须以字母或者下划线开头)
- 局部变量会覆盖同名的全局变量
- 声明:规定变量的类型和名字(在变量名前添加extern可声明变量,如果显式初始化即为定义)
- 定义:负责创建与名字关联的实体,并申请存储空间和赋初始值
- 引用:它只是为存在的对象所起的另外一个名字。它不是一个对象,没有实际的地址,定义是必须初始化
- 指针:本身就是一个对象,允许指针之间的拷贝和赋值
- const表示的不可改变的量,该变量必须初始化(可以在运行时初始化)
- 顶层/底层const:顶层const表示本身是常量(常量指针,声明时const必须放在指针符号后面,即:const ),底层const表示所指的对象是常量(指向常量的指针,如:int const *p_a = &num_a);执行拷贝操作时,拷入拷出对象必须具有相同的底层const资格,或能够强制转换
- 常量表达式:数据类型和初始值都需要是常量类型,值不会改变并在编译过程就能得到计算结果
- constexpr变量:一定是常量,必须用常量表达式(字面值类型,包括算术类型、引用、指针)或constexpr函数(足够简单编译时可计算结果)初始化
- 类型说明符auto会忽略顶层const,保留底层const
- 指针、常量与类型别名:typedef char pstring; const pstring cstr = 0;,与const char cstr不等价,前者的cstr是指向char的常量指针,后者中cstr是指向常量char的指针
5.const 常量
- const 常量必须在定义时初始化
- 常量指针和指向常量的指针
- const int *p,表示指向常量的指针,不能通过p来修改p指向的值,而p本身所指向的地址是可以修改的。
- int *const p,常量指针,表示p本身是一个const,所以p所指的地址不会变,但是地址里的值是可以修改的。
- 顶层const与底层const
- 顶层const是指const修饰变量本身,即变量/对象本身是不可变的。
- 底层const则表示这个变量所指向/引用的值不可变,即不能通过这个变量修改其值,只有对常量的引用和指向常量的指针是底层const
- 12345const int m = 0; //m本身是const类型的值const int* m2 = &m; //所以&m是一个const int*类型的,即常量取地址得到的是一个底层constint* const m3 = &m; //所以第二行没有错,第三行会报错:const int i = 0; //i是底层constint &i2 = i; //报错,因为i2不是底层const