文章目录
- 第2章 变量和基本类型
- 2.1 基本内置类型
- 2.1.1 算术类型
- 2.1.2 类型转换
- 2.1.3 字面值常量
- 2.2 变量
- 2.2.1 变量定义
- 2.2.2 变量声明与定义的关系
- 2.2.3 标识符
- 2.2.4 名字的作用域
-
第Ⅰ部分 c++基础
-
语法特征
- 类型 变量 语句 控制结构 函数
- 补充:自定义数据类型(语言扩展);功能封装成库函数
-
c++ 静态数据类型语言 类型检查发生在编译时
-
c++类 包含 数据成员 函数成员
-
第2章 变量和基本类型
-
数据类型:数据意义 操作
-
内置类型: 字符 整型 浮点型
2.1 基本内置类型
- 算术类型(字符 整型 布尔型 浮点型 ) 空类型
2.1.1 算术类型
- 整型(包括字符和布尔) 浮点型
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | / |
char | 字符 | 8 |
wchar_t | 宽字符 | 16 |
char16_t | Unicode字符 | 16 |
char32_t | Unicode字符 | 32 |
short | 短整型 | 16 |
int | 整型 | 16 |
long | 长整型 | 32 |
long long | 长整型 | 64 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
-
char 空间确保可存放机器基本字符集任意字符对应数字值
-
wchar_t char16_t char32_t 确保可存放机器最大扩展字符集任意字符
-
赋予内存中某地址明确含义需知道存储在地址的数据类型,类型决定数据所占比特数/解释比特内容
-
浮点型 :单/双/扩展精度浮点型 float 1个字32bit;double 2个字64bit;long double 3/4个字96/128bit
- 带符号类型 无符号类型
- (除去 布尔型 扩展字符型)整型可分 带/无符号类型
- 带符号:正、负、0;无符号:大于0
- int short long ,long long 均为带符号,加unsigned为无符号;unsigned int 可简写为unsigned
- 字符型:char(实际上会为后两种的其中一种由编译器决定)、signed char、unsigned char
- unsigned char可表示0-255区间内的值,signed char表示范围-128-127
- 如何选择类型
- 明确值不可能为负时选无符号类型
- 整数运算用int,超出int范围用long long
- 算数表达式不使用char/bool
- 浮点数运算用double(float精度不够/计算代价相差不大)
2.1.2 类型转换
- 类型所能表示的值得范围决定了转换的过程
- 非bool->bool: 0->false; other->ture
- bool->非bool:false->0; ture->1
- 浮点->整型:仅保留小数点前部分
- 整型->浮点:小数部分记为0,若超出浮点类型容量则精度可能有损失
- 给无符号赋超出范围的值->初始值对无符号类型表示数值总数取模后的余数
- 给带符号类型赋超出表示范围的值,结果为未定义
- 避免无法预知(编译器无需/不能检测的错误)和依赖于现实环境的行为
- 含有无符号类型的表达式
- 负数和无符号数相加,先将负数转换为无符号数类似直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模
- 从无符号数减去一个值(无论是不是无符号数),须确保结果不能是一个负值
- 循环中的条件,for不要写无符号数>=0;因为其永远也不会小于0,会导致死循环;改用while(u>0){–u;}
- 切勿混用带符号类型和无符号类型
- 带符号数会自动转换为无符号数
2.1.3 字面值常量
- 整型和浮点型字面值
- 0开头八进制,0x开头16进制
- 字符和字符串字面值
- 单引号字符字面值’a’
- 双引号字符串字面值"a"(常量字符构成的数组array,编译器在字符串结尾添加’\0’,故长度比内容多一;可以分行书写"hello"“world”)
- 转义序列
- 不能直接使用:1. 不可打印;2. 特殊含义字符:单引号 双引号 问号 反斜线
- 换行 \n 横向制表\t 纵向制表\v 退格\b 双引号" 反斜杠\ 回车\r …
- 泛化的转义序列 \x后跟一个或多个16进制数字,\后跟1/2/3个八进制数字
- 指定字面值的类型(前缀(字符和字符串字面值)u,U,L,u8;后缀(整型/浮点型字面值)U,L,LL, F,L)
- 布尔字面值和指针字面值
- 布尔:true false ;指针:nullptr
2.2 变量
- 具名的 可供操作的储存空间;数据类型决定变量所占内存空间大小和布局方式,存储值的范围,能够参与的运算;变量和对象可以互换使用
2.2.1 变量定义
- 类型说明符 变量名(变量名以逗号分隔 以分号结束)
- 对象:一块能存储数据并具有某种类型的内存空间
- 初始值:创建变量时获得的特定值(初始化);初始化不是赋值,赋值:把对象的当前值擦除而以一个新值替代
- 列表初始化int a=0;int a={0};int a{0};//花括号列表初始化 int a(0);
- 默认初始化:定义时没指定初值变量被默认初始化;内置类型定义于函数体外初始化为0,定义于函数体内则不被初始化。(建议初始化每一个内置类型变量)
2.2.2 变量声明与定义的关系
- 分离式编译:将程序分割为若干个文件,每个文件可被独立编译
- 声明:使名字为程序所知(规定变量的类型和名字)(extern);定义:负责创建与名字关联的实体(规定变量的类型和名字外还申请储存空间/可能为变量赋初始值);任何包含显式初始化的声明即成为定义;函数体内部试图初始化extern关键字标记的变量将引发错误;变量只能被定义一次但可被多次声明
- c++静态类型语言,编译阶段检查类型
2.2.3 标识符
- 字母 数字 下划线组成,必须以字母或者下划线开头;长度无限制,大小写敏感
- 不能被用作标识符:关键字,标准库保留名字(连续两个下划线/下划线紧连大写字母开头),定义在函数体外标识符不能以下划线开头
- 变量命名规范:
- 标识符要体现实际含义
- 变量名一般用小写字母
- 自定义类名以大写字母开头
- 标识符由多单词组成,单词间应明显区分(下划线或驼峰)
2.2.4 名字的作用域
- c++作用域以花括号分割
- 名字有效区域:始于名字声明语句,终于声明语句所在作用域末端
- 全局作用域:定义在函数体外(花括号外);块作用域
- 建议第一次使用变量时再定义它
- 嵌套的作用域
- 内层作用域:被包含(被嵌套)的作用域 (允许内层作用域中重新定义外层作用域已有的名字)
- 外层作用域:包含着别的作用域的作用域
- 局部变量正在作用域内(in scope)会覆盖全局变量;域操作符左侧为空如 ::g_cat即为全局作用域对应变量