跳至内容
Topos Uranos

摘要

本课开启本课程的第三单元,这一单元专讲表达式及其运算符。本课说明这一单元的用途:教人构造其值能够被确定无疑地预测的表达式,知道哪个运算先做、结果是什么类型、有哪些副作用,以及哪些表达式没有意义;介绍本单元的四节课和贯穿它们的线索,从整数和实数的算术一直到位和数学库,中间经过条件和未定义行为的目录;回顾本单元假定已从第二单元掌握的内容,即每个数据的类型、它的界限和它的转换;提出本单元要解决的问题,即一个编译时没有任何警告的程序,它对六个学校里的问题给出的回答全都是错的,甚至给不出回答;并说明本单元通向何处,包括后面各单元以及“C++ 程序设计 II”课程。

学习目标

  1. 描述本单元内容的顺序,并说明每节课为其后的那节课提供了什么。
  2. 回顾第 2 单元中必要的内容(整数类型和实数类型、它们的取值范围、溢出以及转换),必要时加以复习。
  3. 借助一个例子预先认识到:表达式的值取决于求值规则(优先级、操作数的类型、作用的顺序),而这些规则并不总是与学校数学的规则一致。
  4. 认识学完本单元时应当会做什么,并把它与后面各单元将要学习的内容区分开。

入门测评

在学习本单元之前,先测一测自己的起点是有益的。这项测评是自我测评:不计分,唯一的目的是为学习指引方向。前四道题检查本单元假定已从第二单元掌握的内容:整数之间的除法、二进制写法、无符号减法以及有符号溢出。其后的六道题按课的顺序涉及本单元的核心思想,其中有几道从学校数学或初等逻辑出发。没有人必须现在就答对,其中两道题里,“我还不知道”是诚实的回答:每个答案,无论对错,都会解释要点,并指出讲解这一要点的那节课。同样的能力会在单元末尾的总结课中再次测量。

入门测评

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

  1. 第 1 题来自前面的单元一个程序声明 const double r{7 / 2}; 并输出 r。会显示什么?

  2. 第 2 题来自前面的单元用八位二进制怎样写出数 13?

  3. 第 3 题来自前面的单元对于 32 位的 unsigned int,std::println("{}", 0u - 1); 输出什么?

  4. 第 4 题来自前面的单元一个程序先执行 int count{std::numeric_limits<int>::max()};,再执行 count = count + 1;。关于 count 的值,标准保证什么?

  5. 第 5 题2+3⋅42 + 3 \cdot 4 和 (2+3)⋅4(2 + 3) \cdot 4 各等于多少?

  6. 第 6 题根据数学中的除法定理,在余数 rr 受条件 0≤r<20 \leq r < 2 约束时,商 qq 和余数 rr(−7-7 除以 22 时)各是多少?

  7. 第 7 题“下雨并且冷”的否定是什么?

  8. 第 8 题std::println("{}", 3 < 5); 输出什么?

  9. 第 9 题执行 int a{5}; 和 int b{a++ * 2}; 之后,a 和 b 各等于多少?

  10. 第 10 题std::println("{}", 2 ^ 3); 输出什么?