测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
B29

类型转换:自动升级与强制转换

引入

章前总览 不同类型混在一起运算时,C++ 会先统一类型。自动转换朝精度高的走;不够用时再用强制转换

本节要点:

  • 常用基本类型一览(拓展)
  • 自动转换:朝 double / int 等“升学”
  • 强制转换:(double)a 或 double(a)

1 C1. 常用基本类型(拓展阅读)

一级常考 intdoublecharfloat。还有 shortlongbool 等,知道“占字节、有取值范围”即可。

注意溢出

  • 超出类型取值范围会发生溢出;编译和运行往往不报错,结果却错。
  • int 就是 signed int;方括号里可省略的写法见教材表。
  • 字节是存储基本单位(回顾第2章存储单位)。

2 C2. 自动类型转换

表达式里出现不同类型时,先转成同一类型再算,原则是朝精度更高的类型转,尽量不丢数据。

常见规则(了解)

  • 两个 float 运算也会先升到 double
  • 两个 char 运算会先变成 int
  • int 遇上 double:int 先升成 double,再运算。
补充说明

不推荐

int d = 5;
double r = d / 2;   // r = 2(错)

问题:d 和 2 都是整数,整除后再赋给 double,小数已经丢了。

推荐写法

double r = d / 2.0;  // 执行时 d 自动升为 double

优点:触发自动转换,半径正确。

3 C3. 强制类型转换

需要“主动”改类型时用强制转换。两种写法等价:

</> 写法

(类型名)(表达式)     // 例:(double)a
类型名(表达式)       // 例:double(a)

int a = 3, b = 4;
double d1 = 1.0 * a / b;   // 0.75
double d2 = (double)a / b; // 0.75
  • 比喻:自动转换像正常升级;强制转换像“跳级”。
  • int(3.14) 得到 3(截断小数,不是四舍五入)。
  • char(c+4):先按整数加,再转回字符输出。

易错

  • 0.0 + a/b(a、b 为 int)先算整数除法,再加 0.0,得不到小数商。
  • 应写成 (a+0.0)/ba/(0.0+b)(double)a/b
小结

要小数商,记住三板斧:

1.0 * a / b
a / 2.0
(double)a / b   或   double(a) / b
里程碑达成:

下一节做第5章基础知识自测(选择题 + 判断题)。