注:c++是静态类型语言,即编译阶段检查类型
一. 分类:基本数据类型可以分为算术类型和空类型。算术类型:字符、整型数、布尔值、浮点数。空类型不对应具体的值。
算术类型:还可以分为:整型(包括字符,布尔,整型数)、浮点型。浮点型还可以分为单精度(float)、双精度(double)、和扩展精度(long double)
类型 | 占的空间(字节) | 取值范围 |
---|---|---|
short | 2 | 216-1~216-1-1 |
int | 4 | 2-31~231-1 |
unsigned int | 4 | 0~232-1 |
long | 4 | 2-31~231-1 |
unsigned | 4 | 0~232-1 |
char | 1 | |
unsigned char | 1 | 0~255 |
signed char | 1 | -128~127 |
float | 4 | 保留小数点后7位,保证6位有效数字 |
double | 8 | 保留小数点后16位,保证15位有效数字 |
注:大多数机器:
一个字节 = 8个bite(位)
一个字 = 4个字节
通常:float一个字,double2个字
整型:整型数、字符型、布尔型
除去布尔型和扩展型外,其他整型还可划分为带符号和无符号,其中:int、short、long、long long均为带符号和类型,前面加unsigned 变为无符号,而字符型则分为:char、unsigned char、signed char 。也就是说char型根据编译器不同可能会是表现不同类型。
选择数据类型的经验:
- 整数运算:int
- 浮点运算:double
- 明确知晓数值不可能为负:无符号类型
- 算术表达式不要有布尔类型和char
二. 类型转换
- 非布尔的算术值赋给布尔类型,初始值为0,则为false,否则,为ture。
- 布尔值赋给非布尔类型,初始值为false,则为0,初始值为ture,则为1。
bool b=42;//b为真
int i=b;//i=1
i=3.14;//i =3
double pi = i;//pi=3.0
- 把浮点型赋给整数类型,近似处理,只保留整数部分。
- 吧整数型赋给浮点型,小数记为0
unsigned char c= -1;//c=255
signed char d = 256;//c未定义
- 把一个超过取值范围的数赋给无符号类型,结果为该数对该无符号类型表示数值总数取模后的余数。模:即该类型的取值范围
- 把一个超过取值范围的数赋给有符号类型,结果为未定义的,很危险。
含有无符号类型的转化。
unsigned u =10;
int i = -42;
cout<<i+i<<endl;//输出-84;
cout<<u+i<<endl;//int4字节的话,则输出10+2^32^-42
signed u =10,i=42;
cout<<u-i<<endl;//输出-32
负数转化为无符号数,等于该类型的无符号取值的最大值与该数进行运算。上例为-42则为:232-42
注:补充:
1个字节8位,取值范围:无符号:0~28-1
带符号:-27~27-1
注:
int (4字节):
正数1:0000 0000 0000 0001
负数-1:因为int是带符号的类型,第一位代表符号,所以理论上为:1000 0000 0000 0001;但负数采用补码形式:即取绝对值后取反再加1。即1111 1111 1111 1111,
注:带符号类型和不带符号类型不要混用。
三. 字面值常量。
3.1 整型数的字面值常量
每个字面值常量都对应一种数据类型,字面值常量的形式和值决定其数据类型。
注:进制:二进制:十进制:八进制:0开头的整数,十六进制:以0x开头的整数
3.2 浮点数的字面值:一个小数或者科学计数法
3.3 字符和字符串字面值:
字符型字面值:以单引号包括起来的一个字符如:‘c’
字符串型字面值:以双引号括起来的空字符或多个
字符"abc"
注:字符串字面值实质为由常量字符构成的数组,每个字符串后有一个\0(空字符),所以字符串字面值的长度比内容多1。
3.4 转义序列
3.4.1 转义字符:
3.4.2 泛化的转移序列:
\7 (响铃)
\0(空)
\40(空格)
\12(换行)
\115(字符M)
四. 指定字面值的类型
区分前后缀的u、U、L。前缀u、U是表示16或32位,L是表示宽字符。后缀u或U是表示不带符号的类型。
五. 变量
5.1 变量的组成:类型说明符 变量名
5.2初始化:初始化不等于赋值。初始化是创建变量时给其一个初始值,而赋值是把对象的当前值擦除,替换一个新值。
5.2.1 列表初始化:用花括号。如 int a={0);
等价于int a=0;
等价于int a (0);
等价于int a{0};
使用这种初始化的特点,当存在信息丢失,如浮点型数赋值给为整型的初始化时,会报错,
5.2.2 默认初始化:
- 内置类型的变量未被显式初始化,它的值由定义的位置决定。定义在任何函数体外的初始化值默认0.
- 绝大数类支持无需显性初始化,因为其类提供了一个初始化值,如string类
- 一些类规定必须显性初始化。
5.3 变量的声明和定义
声明:因为c++支持分离式编译,所以多个文件中,一个文件想要使用另一个文件的定义的变量,则需要声明。
定义:创建与名字关联的实体
声明一定不要显式初始化。不然就变成了定义。
如:
extern int i;//声明并定义i
int j;//定义j
extern int z = 0;//定义z
变量只能被定义一次,但可以多次声明
如果在多个文件中使用同一变量,必须分开定义和声明。变量的定义只能出现在一个文件中。其他用到该变量的文件必须对其进行声明。而不能重复定义。
5.4 标识符
标识符由字母、数字和下划线组成。且必须以字母或下划线开头。
5.5 名字的作用域
全局作用域、块作用域、嵌套的作用域
绝大数作用域以花括号分隔
同一个名字在不同作用域中可能指向不同的实体
全局:定义在函数体外的名字
块:定义在函数体内,且非某一单独语句段如if、for中,整个函数都可以使用
定义在单独的花括号内的如if、for等中,只能在该处使用
注意:函数内不宜含有和全局变量相同的名字变量