文章

【GESP】C++二级考试大纲知识点梳理, (6)数据类型转换

在编程中,我们经常需要把一种数据类型变成另一种数据类型(比如把小数变成整数,或者把字符变成数字)。这就是数据类型转换。掌握好它,可以避免很多隐蔽的 Bug。本篇深度解析大纲第 6 条考点。

(6)掌握数据类型的转换:强制类型转换和隐式类型转换。

二级考点系列:


一、为什么需要类型转换?

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. 混合运算

    1
    2
    3
    4
    
     int a = 10;
     double b = 3.5;
     cout << a + b; // 输出 13.5
     // 过程:即便 a 是 int,但为了和 b 相加,它先被自动提升为 double 10.0
    
  2. 赋值转换: 把一个数赋值给不同类型的变量时,会自动转成该变量的类型。
    1
    2
    
     double d = 10;   // 10 (int) -> 10.0 (double)
     int i = 3.99;    // 3.99 (double) -> 3 (int) 【注意:小数部分直接丢弃,不四舍五入!】
    
  3. 函数调用: 如果函数需要 double 参数,你传了 int,编译器也会自动转换。


三、强制类型转换 (显式转换)

强制转换是指程序员明确命令编译器进行的转换。通常用于那些编译器不会自动做,或者自动做的不合心意的时候。

3.1 语法格式

C++ 支持两种写法(考试中C语言风格更常见,但两种都要认得):

  1. C 语言风格(推荐,简单粗暴):
    1
    
     (类型名) 变量或表达式
    

    例如:(double)a

  2. 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$ inttrue1false0
  • int $\rightarrow$ bool非 0 都变 true只有 0false
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),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权