10 Genaral Issues in Using Variables

本章中的名词

  • 变量 -> 对象和内置数据类型,如整数和数组
  • 数据类型 -> 内置数据类型
  • 数据 -> 对象,或内置数据类型

创建有效数据的第一步是了解所要创建数据的种类。积累大量的数据类型对于程序员来说是至关重要的

10.1 Data Literacy

在你熟悉的概念前面写上1, 在你认为自己知道其含义但却不确定的概念前面写 0.5. 写完以后把分数加到一起, 然后根据后面的记分表来解释分数所代表的含义。
image.png

个人笔记

  • 很有趣!

关于Data Types推荐的参考书

  • 算法导论
  • 算法第四版/第三版(C++实现)

    10.2 Making Variable Declarations Easy

  • 对于使用支持隐式声明(implicit declarations)的语言的建议

10.3 Guideslinesfor Initializing Variables

不恰当初始化产生的问题

  • 从未对变量賦值。它的值只是程序启动时变量所处内存区域的值
  • 变量值已经过期。变量在某个地方曾经被赋值,但该值己经不再有效。
  • 变量的一部分被赋值,而另一部分没有。

最后一条有几种可能的情况

  • 可能初始化了一个对象的部分成员,而不是全部成员
  • 也可能忘记事先分配内存,就去初始化一个未经初始化的指针所指的“变量”

这块内存可能存放的是数据,也可能存放的是代码。甚至可能指向操作系统内部。指针操作错误可能产生很奇怪的现象,并且每次都不相同。 这也导致了调试指针错误比调试其他错误更困难。

避免产生初始化错误的建议

  • 在声明变量的时候初始化
  • 在靠近变量第一次使用的位置初始化

    • 对于不支持声明变量并同时初始化的语言,例如VB

      就近原则(Principle of Proximity): 把相关的操作放在一起

  • 理想情况下,在靠近第一次使用变量的位置声明和定义该变量

    • 声明指定了变量的类型
    • 定义为变量指定特定的取值
    • 在理想情况下,每个变量都应该在声明的同时被定义
  • 在可能的情况下使用final或者const
    • Java中使用final, C++中使用const
    • finalconst关键字在定义类常量(class constants), 输入参数以及任何初始化后其值不再发生改变的局部变量时非常有用
  • 特别注意计数器和累加器
    • 在下一次使用这些变量之前忘记重置其值
  • 在类的构造函数里初始化该类的数据成员
    • 正如子程序的变量应该在每一个子程序内部初始化一样,类的数据也应该在其构造函数中初始化。
    • 如果在构造函数里面分配了内存,那么就应该在析构函数中释放这些内存
  • 检查是否需要重新初始化
  • 一次性初始化具名常量:用可执行代码来初始化变量

    个人笔记

    • 没有见到过实际代码中的应用
  • 使用编译器设置来自动初始化所有变量

    • 然而,当你把代码移植到另一台机器或者编译器的时候,依赖特定的编译器设置就会带来问题
  • 利用编译器的警告信息
  • 检查输入参数的合法性
  • 使用内存访问检查工具来检查错误的指针
  • 在程序开始时初始化工作内存
    • 可以用某种在程序运行前预先填充内存的工具(memory filler)来把程序的工作内存填充为一个可以预料的值
    • 如果使用内存填充工具,那么可以偶尔改变一下用来填充内存的值
    • 可以让程序在启动时初始化工作内存

      个人笔记

      • 第一次听说