《第二单元的思维导图》
一、中心主题:数据类型、运算符与表达式
1.1 数据类型
1.1.1 基本数据类型
-
整型 (Integer)
int
: 标准整型,通常占用4个字节 (32位)short int
或short
: 短整型,通常占用2个字节 (16位)long int
或long
: 长整型,通常占用4或8个字节 (取决于编译器和平台)long long int
或long long
: 长长整型,通常占用8个字节 (64位)- 无符号整型 (unsigned):
unsigned int
unsigned short int
unsigned long int
unsigned long long int
- 作用: 存储整数,根据取值范围选择合适的类型,无符号类型存储非负整数。
- 注意: 不同平台和编译器可能对同一类型分配不同的字节数,需要使用
sizeof()
运算符来确认。
-
浮点型 (Floating-point)
float
: 单精度浮点型,通常占用4个字节 (32位),精度约为7位有效数字。double
: 双精度浮点型,通常占用8个字节 (64位),精度约为15位有效数字。long double
: 长双精度浮点型,通常占用10或12或16个字节 (取决于编译器和平台),精度更高。- 作用: 存储带有小数部分的数值,
double
通常是首选,精度足够且效率较高。 - 注意: 浮点数存在精度问题,不适合进行精确比较。
-
字符型 (Character)
char
: 通常占用1个字节 (8位),可以存储ASCII字符集中的字符。- 作用: 存储单个字符,例如字母、数字、符号。
- 本质: 字符在计算机中以整数形式存储,实际上是存储字符对应的ASCII码值。
-
布尔型 (Boolean)
bool
: C++内置类型,表示真 (true) 或假 (false)。- 作用: 用于逻辑判断和条件控制。
- 本质:
true
通常表示为1,false
通常表示为0。
-
空类型 (Void)
void
: 表示无类型。- 作用:
- 函数没有返回值时,声明返回类型为
void
。 - 函数没有参数时,声明参数列表为
void
(C++中可省略)。 void*
指针可以指向任何类型的内存地址。
- 函数没有返回值时,声明返回类型为
1.1.2 派生数据类型
-
指针 (Pointer)
- 存储变量的内存地址。
int* p;
: 指向int
类型变量的指针。- 作用: 允许间接访问和修改变量,实现动态内存分配,提高程序效率。
- 注意: 必须初始化后才能使用,否则可能导致程序崩溃。
- NULL指针: 指向地址0,表示指针未指向任何有效内存地址。
- *void 指针**: 通用指针类型,可以指向任何类型的内存地址,但需要强制类型转换才能进行解引用操作。
-
数组 (Array)
- 相同数据类型元素的集合。
int arr[10];
: 声明一个包含10个int
类型元素的数组。- 作用: 存储多个相同类型的数据,方便批量处理。
- 注意: 数组的大小在编译时确定,访问数组元素时需要注意下标越界问题。
-
结构体 (Struct)
-
不同数据类型元素的集合。
-
c++ struct Student { string name; int age; float score; };
-
作用: 将多个相关的数据组织在一起,方便管理和操作。
-
-
枚举 (Enum)
-
为整数常量定义别名。
-
c++ enum Color { RED, GREEN, BLUE };
-
作用: 提高代码可读性和可维护性。
-
-
联合体 (Union)
-
多个成员共享同一块内存空间。
-
c++ union Data { int i; float f; char str[20]; };
-
作用: 节省内存空间,但在同一时刻只能存储一个成员的值。
-
1.1.3 类型转换
- 隐式类型转换 (Implicit Type Conversion)
- 编译器自动进行的类型转换,通常发生在运算过程中,将精度低的类型转换为精度高的类型。
- 例如:
int
+float
->float
+float
- 显式类型转换 (Explicit Type Conversion)
- 程序员手动进行的类型转换。
- C风格:
(type) expression
- C++风格:
static_cast<type>(expression)
,dynamic_cast<type>(expression)
,reinterpret_cast<type>(expression)
,const_cast<type>(expression)
- 作用: 强制将一个类型转换为另一个类型,需要谨慎使用,可能导致数据丢失或类型安全问题。
1.2 运算符
1.2.1 算术运算符
+
加法-
减法*
乘法/
除法%
取余 (模运算)++
自增--
自减
1.2.2 关系运算符
==
等于!=
不等于>
大于<
小于>=
大于等于<=
小于等于
1.2.3 逻辑运算符
&&
逻辑与 (AND)||
逻辑或 (OR)!
逻辑非 (NOT)
1.2.4 位运算符
&
按位与|
按位或^
按位异或~
按位取反<<
左移>>
右移
1.2.5 赋值运算符
=
简单赋值+=
加法赋值-=
减法赋值*=
乘法赋值/=
除法赋值%=
取余赋值&=
按位与赋值|=
按位或赋值^=
按位异或赋值<<=
左移赋值>>=
右移赋值
1.2.6 其他运算符
sizeof
返回变量或类型的大小 (字节数)?:
条件运算符 (三元运算符),
逗号运算符.
成员访问运算符 (用于结构体和对象)->
成员指针访问运算符 (用于结构体和对象)[]
数组下标运算符()
函数调用运算符
1.2.7 运算符优先级与结合性
- 优先级: 决定了表达式中不同运算符的计算顺序。
- 结合性: 决定了相同优先级运算符的计算顺序 (从左到右或从右到左)。
- 记忆: 括号优先级最高,赋值运算符优先级最低,单目运算符高于双目运算符。 算数运算符>关系运算符>逻辑运算符>赋值运算符
- 建议: 尽量使用括号来明确运算顺序,避免混淆。
1.3 表达式
1.3.1 算术表达式
- 使用算术运算符进行计算的表达式。
- 例如:
a + b * c
1.3.2 关系表达式
- 使用关系运算符进行比较的表达式。
- 结果为
bool
类型 (true
或false
)。 - 例如:
a > b
,x == y
1.3.3 逻辑表达式
- 使用逻辑运算符连接的表达式。
- 结果为
bool
类型 (true
或false
)。 - 例如:
(a > b) && (c < d)
1.3.4 赋值表达式
- 使用赋值运算符进行赋值的表达式。
- 例如:
a = b + c
1.3.5 条件表达式
- 使用条件运算符 (
?:
) 的表达式。 condition ? expression1 : expression2
- 如果
condition
为true
,则返回expression1
的值,否则返回expression2
的值。
1.3.6 逗号表达式
- 使用逗号运算符连接的多个表达式。
- 从左到右依次计算每个表达式,返回最后一个表达式的值。
- 例如:
(a = 1, b = 2, a + b)
结果为3
1.4 常量与变量
1.4.1 常量
- 在程序执行过程中,值不能被修改的量。
- 字面常量: 直接写出的常量值,例如:
10
,3.14
,"Hello"
。 - 符号常量: 使用
const
关键字定义的常量,例如:const int MAX_SIZE = 100;
。 - 宏常量: 使用
#define
预处理指令定义的常量,例如:#define PI 3.14159
。 - 枚举常量: 枚举类型中的成员。
1.4.2 变量
- 在程序执行过程中,值可以被修改的量。
- 定义: 声明变量的数据类型和名称。
- 初始化: 为变量赋初值。
- 作用域: 变量可以访问的范围。
- 局部变量: 在函数或代码块内部定义的变量,只能在该函数或代码块内部访问。
- 全局变量: 在函数外部定义的变量,可以在整个程序中访问。
- 生存期: 变量存在的时期。
- 自动变量: 局部变量,在函数调用时创建,在函数返回时销毁。
- 静态变量: 使用
static
关键字修饰的变量,只初始化一次,在程序运行期间一直存在。
- 存储类别:
auto
: 自动存储 (默认,通常省略)。static
: 静态存储。register
: 寄存器存储 (建议编译器将变量存储在寄存器中,提高访问速度,但并非所有变量都能存储在寄存器中)。extern
: 外部存储 (用于声明在其他文件中定义的变量)。
1.5 输入输出
1.5.1 标准输入输出流
iostream
头文件cin
: 标准输入流,用于从键盘读取数据。cout
: 标准输出流,用于向屏幕输出数据。cerr
: 标准错误输出流,用于输出错误信息。clog
: 标准日志输出流,用于输出日志信息。
1.5.2 格式化输入输出
- 使用
iomanip
头文件中的控制符来格式化输入输出。 setw(n)
: 设置字段宽度为n。setprecision(n)
: 设置浮点数的精度为n。fixed
: 以固定点表示法显示浮点数。scientific
: 以科学计数法表示浮点数。setfill(c)
: 设置填充字符为c。left
: 左对齐。right
: 右对齐。
二、重点与难点
- 数据类型的选择:根据实际需求选择合适的数据类型,避免浪费内存空间,保证数据精度。
- 运算符优先级与结合性:理解运算符的优先级和结合性,避免表达式出现歧义。
- 类型转换:理解隐式类型转换和显式类型转换,避免数据丢失或类型安全问题。
- 指针:理解指针的概念和使用,掌握指针的运算和应用。
- 输入输出:掌握标准输入输出流的使用,了解格式化输入输出的方法。
三、学习方法
- 多练习:通过编写程序来巩固所学知识。
- 多思考:理解数据类型、运算符和表达式的本质。
- 查阅资料:参考C++标准文档和相关书籍。
- 交流讨论:与同学和老师交流学习心得。