跳至内容
Topos Uranos

摘要

本课开启本课程的第二单元,这一单元专讲数据及其类型。本课说明这一单元的用途:讲明程序中的每个数据都带着一个类型存放在内存里,类型规定它能取哪些值、占多少空间、允许哪些运算,并且这些限制会带来可以观察到的后果;介绍本单元的四节课和贯穿它们的线索,从作为带有名字和值的存储单元的变量,一直到类型之间的转换和常量;回顾本单元假定已从第一单元掌握的内容,即编写、编译并运行一个读取输入、写出结果的程序;提出本单元要解决的问题,即一个看上去正确的程序,其计算结果却与数学的结果不一致,从和 0.1+0.20.1 + 0.2 说起,它在计算机中并不恰好等于 0.30.3;最后指出它通向何处,即后面的各单元和“C++ 程序设计 II”课程。

学习目标

  1. 描述本单元内容的顺序,并说明每节课为其后的那节课提供了什么。
  2. 回顾第 1 单元中必要的内容(编译与运行的流程、带格式的输出、用 std::cin 读取,以及阅读编译器的消息),必要时加以复习。
  3. 借助一个例子,解释为什么程序中的数不是数学中的数,并预先说明为什么在计算机中 0.1+0.20.1 + 0.2 不恰好等于 0.30.3。
  4. 认识学完本单元时应当会做什么,并把它与后面各单元将要学习的内容区分开。

入门测评

在学习本单元之前,先测一测自己的起点是有益的。这项测评是自我测评:不计分,唯一的目的是为学习指引方向。前四道题检查本单元假定已从第一单元掌握的内容:逐步跟踪一个过程、用两位小数写出一个数、舍入,以及阅读一条错误消息。其后的六道题按课的顺序涉及本单元的核心思想。没有人必须现在就答对,其中一道题里,“我还不知道”是诚实的回答:每个答案,无论对错,都会解释要点,并指出讲解这一要点的那节课。同样的能力会在单元末尾的总结课中再次测量。

入门测评

开始本单元之前,先测一测你的起点。这是一次简短的自我测评:不计分,结果只保存在你的浏览器中。

  1. 第 1 题来自前面的单元一个过程写道:“1. rr 取值 17。2. rr 取值 r−5r - 5。3. rr 取值 r−5r - 5。”结束时 rr 的值是多少?

  2. 第 2 题来自前面的单元语句 std::println("{:.2f}", 2.0 / 3); 输出什么?

  3. 第 3 题来自前面的单元要把 12.34612.346 写成两位小数,并进行舍入。得到什么?

  4. 第 4 题来自前面的单元一个程序的第 5 行是 const int pages{12},第 6 行是 std::println("{}", pages);。编译器输出 6:5: error: expected ',' or ';' before 'std'。缺陷在哪里?

  5. 第 5 题一个程序声明了 int a{2}; 和 int b{7};,然后执行 a = b; 和 b = 10;。最后 a 的值是多少?

  6. 第 6 题数 13 用二进制怎么写?

  7. 第 7 题一个 4 字节的 int 存放着 2 147 483 6472\,147\,483\,647,即它的最大值,程序再给它加 1。可以断言什么?

  8. 第 8 题1/31/3 有有限的小数表示吗?

  9. 第 9 题std::println("{}", 0.1 + 0.2); 输出什么?

  10. 第 10 题一个程序声明 const double ratio{7 / 2};,然后输出 ratio。会出现什么?