实用经验 43 同魔鬼数字说再见

魔鬼数字,也被称为幻数。指的是那些上下文里出现的字面常量。魔鬼数字可以是数字,也可以使字符串。

魔鬼数字最主要的问题不是他影响程序的功能,而是他没有抽象语义,影响程序的可读性。当我们阅读和维护程序时,我们不得不一个个地搞清楚每个光秃秃的数字到底代表了什么意思。没错,通过这种方式我们确实也可以勉强度日。但是为了读懂代码,我们付出了很多的精力。但是有时我们理解的可能还不是很准确。

在代码中使用魔鬼数字(没有具体含义的数字、字符串等)将会导致代码难以理解,应该将数字定义为名称有意义的常量。将数字定义为常量的最终目的是为了使代码更容易理解,所以并不是只要将数字定义为常量就不是魔鬼数字了。如果常量的名称没有意义,无法帮助理解代码,同样是一种魔鬼数字。在个别情况下,将数字定义为常量反而会导致代码更难以理解,此时就不应该强求将数字定义为常量。 我们看下面这段代码:

 //这里的一些10分别代表什么意思??
 class Portfolio
  {
      //...
      Contact *contracts_[10];
      char id_[10];
  };
  
  ......
  
 for (int i = 0; i < 10; ++i)
 ...

魔鬼数字的另一个不那么显而易见的坏处就是它会以意想不到的方式降低它所代表的类型的精度。例如:4000, 它实际类型是平台相关的。

另一个字面常量带来的潜在威胁来源于它们没有地址。

给幻数起一个名字。作为一个指导原则,除了0和1之外,程序里出现的任何数大概都可以算作幻数,它们应该有自己的名字。例如,下面这个例子:

class Portfolio
{
     //...
     enum {maxContracts = 10, idLen = 10};
     Contact *contracts_[maxContracts];
     char id_[idLen];
 };

在其所在作用域有着明确含义的枚举常量,有着不占空间,也没有任何运行期成本的巨大优点。

把数定义为常数,不要定义为宏。C语言的传统方式是使用#define行来对付魔鬼数字。C语言预处理程序是一个强有力的工具,但是它又有些鲁莽。使用宏进行编程是一种很危险的方式,因为宏会在背地里改变程序的词法结构。我们应该让语言去做正确的工作(C预处理命令本身不是C语言的组成部分)。

在c/c++里,整数常数可以用枚举语句声明。在C++里,任何类型都可以使用const声明的常数:

const int MAXROW = 24,  MAXCOL = 80;

C语言也有const值,但是他们不能用作数组的界。这样,enum就是C中唯一可用的选择了。而C++无此限制,你可以尽情使用const值,享受const值给你带来的方便。

请谨记

  • 避免在程序中出现魔鬼数字,因为这样可提高程序的可读性
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值