跳至内容
Topos Uranos

字符、布尔值、类型转换与常量

摘要

类型不仅规定一个数据占多少字节,还规定它的位如何解读:同一个字节,对 char 来说是字母“A”,对 int 来说是数 65。本课用字符和布尔值补全基本类型,并研究从一种类型到另一种类型的过渡:隐式转换,即编译器不经要求就进行、并且可能丢失信息的转换;用 static_cast 进行的显式转换;以及拒绝信息丢失的花括号初始化。最后讲常量 const 和 constexpr,它们把一种意图(“这个值不变”)变成编译器加以核查的保证;还有字面量和 auto,它们决定源代码中写出的值是什么类型。

学习目标

  1. 利用字符的数值编码进行计算,例如求出作为字符读入的数字的值。
  2. 预测整数、实数和布尔值之间隐式转换的结果,并用 static_cast 写出显式转换。
  3. 解释花括号初始化为什么拒绝丢失信息的转换,以及 GCC 在每种情况下怎样处理。
  4. 用 const 或 constexpr 声明每一个不应改变的值,并区分这两个关键字。
  5. 推断字面量(5、5u、5.0、5.0f、'5'、"5")的类型,以及 auto 赋予它的类型。

类型即解读方式

变量与内存一课把变量介绍为一个有名字、类型和值的存储单元;整数及其表示和浮点数两课则表明,存储单元里装的不是数而是位,类型说明如何解读它们。本课把这个想法推到它的结论:既然类型是解读的规则,那么同样的位按不同的类型去读,就意味着不同的东西;而把一个值从一种类型变到另一种类型,在 C++ 中称为类型转换,就是更换规则。有些转换保留值(整数 7 变成实数 7.0,什么也不丢失);另一些则改变值(实数 2.7 变成整数 2)。由此引出贯穿本课的问题:每次转换时,值是否保留?由谁来核查?