跳过正文

丙加·第2章·答案

·143 字·1 分钟·
  1. 找出以下变量名中的错误项,并说明原因:

    • 2things: 错误。变量名不能以数字开头。

    • my var: 错误。变量名不能包含空格。

    • double: 错误double 是 C/C++的关键字,不能用作变量名。

    • $price: 错误。变量名只能由字母、数字和下划线组成,不能包含 $

    • _sys_flag: 正确。虽然以 _ 开头的名称通常为库或编译器内部使用,但语法上是合法的。

  2. 选择合适的数据类型定义变量来表示以下数据:

    • 一个人的年龄: unsigned intint
      理论上 charshortlong 等等也可以,但是很少这么做
      char 显得意图不清晰;shortlong 用得少;而 long long 就太浪费了

    • 圆周率 π: double
      理论上 floatlong double 也可以,不过一般 double 是兼顾精度和占用的最优解

    • 考试是否及格: bool (C++) 或 int (C)

    • 地球的人口数量 (约 80 亿): long longunsigned long long
      因为 80 亿已经超过了 int/long 的 42 亿上限了

    • 一个英文字母: char
      理论上 int 等更大的亦可以,但是没必要浪费

    • 银行系统的存款: long long int(或者自定义的大整数类型)
      是不是以为 ¥1145.14 就要使用 double?或许更熟悉的读者还会想到 long double 这种精度更高的类型。

      然而,这是一个经典的陷阱!

      请回想一下浮点数的精度问题:0.1 + 0.2 ≠ 0.3。这种微小的误差在科学计算中或许可以接受,但在金融系统中是 绝对致命 的。每天有数以亿计的交易,每一笔交易即使只产生微不足道的误差,累加起来也会造成巨大的、无法解释的资金缺口。此外,虽然现在有了符号化的数字表示(比如 0.1 存储为 1/10),但是此方法因为约分、化简的过程,运算较慢,也不适合这种场景(想想证券交易所)

      因此,银行和金融系统的通用做法是:使用整数类型,以“分”(或者该货币的最小单位)为计量单位来存储金额

      • 114514.19元 -> 存储为 11451419(分)

      • 所有的加减乘除运算都在整数层面进行

      • 只在最终需要显示给用户看的时候,才转换为带小数点的格式

      很多时候,连 long long int 的范围也不够用(想象一下国家级别的财政运算),这时开发者会使用 自定义的无限整数类(Class,可以理解为更强大的自定义类型)来处理。但无论如何,其核心依然是 整数,而非浮点数。

  3. int a;int a = 0; 有什么区别?分作用域考虑。

    • 全局作用域:

      • int a;定义,编译器会将其置于静态存储区并 自动初始化为 0

      • int a = 0; 也是 定义,效果是 显式初始化为 0。两者在此作用域下最终效果相同,但显式初始化意图更清晰。

    • 局部作用域 (例如在函数内部):

      • int a;定义,编译器将其置于栈上,不会对其进行初始化。它的值是 未定义的(垃圾值),使用它是危险的。

      • int a = 0;定义并初始化,将其 显式初始化为 0。这是一种安全且良好的编程习惯。

命令提示符@CommandPrompt-Wang
作者
命令提示符@CommandPrompt-Wang