【GESP】C++二级考试大纲知识点梳理, (6)数据类型转换
在编程中,我们经常需要把一种数据类型变成另一种数据类型(比如把小数变成整数,或者把字符变成数字)。这就是数据类型转换。掌握好它,可以避免很多隐蔽的 Bug。本篇深度解析大纲第 6 条考点。
(6)掌握数据类型的转换:强制类型转换和隐式类型转换。
二级考点系列:
- 【GESP】C++二级考试大纲知识点梳理, (1)计算机存储的基本概念及分类
- 【GESP】C++二级考试大纲知识点梳理, (2)计算机网络的基本概念及分类
- 【GESP】C++二级考试大纲知识点梳理, (3)计算机程序设计语言相关知识
- 【GESP】C++二级考试大纲知识点梳理, (4)流程图
- 【GESP】C++二级考试大纲知识点梳理, (5)编码与 ASCII
- 【GESP】C++二级考试大纲知识点梳理, (6)数据类型转换
- 【GESP】C++二级考试大纲知识点梳理, (7)多层分支结构
- 【GESP】C++二级考试大纲知识点梳理, (8)多层循环结构
- 【GESP】C++二级考试大纲知识点梳理, (9)常用数学函数
一、为什么需要类型转换?
C++ 是强类型语言,这意味着每个变量都有固定的类型,不能随便混用。 但在实际计算中,不同类型的数据经常需要“在一起”。 例如:
- 你想算
5个苹果分给2个人的平均数(整数除以整数,结果想要小数2.5)。 - 你想把字符
'A'变成数字65去运算。 这时候,就需要类型转换。
二、隐式类型转换 (自动转换)
隐式转换是指编译器在后台悄悄帮你完成的转换,不需要你写额外的代码。
2.1 转换原则
通常遵循“低精度向高精度转换”的原则(也叫宽化转换),以保证数据不丢失。 转换链条: char / short $\rightarrow$ int $\rightarrow$ long long $\rightarrow$ float $\rightarrow$ double
只要表达式中有一个
double,整个表达式的运算结果通常就会变成double。
2.2 常见触发场景
混合运算:
1 2 3 4
int a = 10; double b = 3.5; cout << a + b; // 输出 13.5 // 过程:即便 a 是 int,但为了和 b 相加,它先被自动提升为 double 10.0
- 赋值转换: 把一个数赋值给不同类型的变量时,会自动转成该变量的类型。
1 2
double d = 10; // 10 (int) -> 10.0 (double) int i = 3.99; // 3.99 (double) -> 3 (int) 【注意:小数部分直接丢弃,不四舍五入!】
- 函数调用: 如果函数需要
double参数,你传了int,编译器也会自动转换。
三、强制类型转换 (显式转换)
强制转换是指程序员明确命令编译器进行的转换。通常用于那些编译器不会自动做,或者自动做的不合心意的时候。
3.1 语法格式
C++ 支持两种写法(考试中C语言风格更常见,但两种都要认得):
- C 语言风格(推荐,简单粗暴):
1
(类型名) 变量或表达式
例如:
(double)a - C++ 函数风格:
1
类型名(变量或表达式)
例如:
double(a)
3.2 核心应用场景
场景 1:整数除法求小数(必考!)
在 C++ 中,整数除以整数,结果还是整数(直接舍去小数)。 5 / 2 结果是 2,而不是 2.5。 如果你想要 2.5,必须把其中一个数强转为 double。
1
2
3
4
5
int a = 5, b = 2;
double r1 = a / b; // 错误!先把 2 赋值给 r1,结果 2.0
double r2 = (double)a / b; // 正确!5.0 / 2 -> 2.5
double r3 = 1.0 * a / b; // 技巧:乘以 1.0 也能实现隐式转换
场景 2:浮点数取整
有时候我们需要把小数的尾巴切掉,只保留整数部分。
1
2
float price = 19.9;
int yuan = (int)price; // 结果 19
注意:强制转换成 int 是向下取整(截断),不是四舍五入。如果要四舍五入,通常用 (int)(price + 0.5)。 或者函数 round()。
1
int yuan = (int)round(price); // 结果 20
场景 3:字符与数字互转
虽然 char 自动转 int 很顺滑,但显式写出来代码更清晰。
1
cout << (int)'A'; // 明确告诉我们要看 'A' 的 ASCII 码
四、考试避坑指南
1. 转换的优先级
强制转换运算符 () 的优先级很高。
(double) a / b$\rightarrow$ 先把a转 double,再除以b。(正确,得小数)(double) (a / b)$\rightarrow$ 先算整数除法a/b(已经截断了),再把结果转 double。(错误,精度已丢失)
2. bool 类型的转换
bool 也是整数的一种变体。
bool$\rightarrow$int:true变1,false变0。int$\rightarrow$bool:非 0 都变true,只有 0 变false。
1
bool b = -5; // b 是 true
3. 精度丢失警告
把 long long 强转给 int,或者把 double 强转给 int,都可能会丢失数据(溢出或截断)。除非你非常确定数据在范围内,否则要小心使用。
五、总结
| 转换类型 | 主导者 | 发生时机 | 典型例子 | 核心用途 |
|---|---|---|---|---|
| 隐式转换 | 编译器 | 混合运算、赋值 | double d = 10; | 方便编写,防数据丢失 |
| 强制转换 | 程序员 | 咱们指定的代码 | (double)5 / 2 | 解决整数除法、截断小数 |
对于二级考生,最关键的一条铁律就是:做除法运算时,如果结果可能有小数,务必先把被除数强转为 double!
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
“luogu-”系列题目可在洛谷题库进行在线评测。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
