本节书摘来自异步社区出版社《c++覆辙录》一书中的第1章,第1.2节,作者: 【美】stephen c. dewhurst(史蒂芬 c. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。
幻数,用在这里时其含义是上下文里出现的裸字面常量(raw numeric literal),本来它们应该是具名常量(named constant)才对:
if( portfolio *p = getportfolio() )
for( int i = 0; i < 10; ++i )
p->contracts_[i] = 0, p->id_[i] = '0';`
现在维护工程师可有事做了。他们不得不在portfolio型别中出现的毫不相关的、但正好值相同的两个“10”之间费劲地识别出它们各自的意思并分别处理6。当这一切头疼的事有着极为简单的解决方案时,我们真的没有理由不去做:
const long *p1 = &40000; // 错误!②
const long *p2 = &patiencelimit; // 没问题
const long &r1 = 40000; // 合法,不过常见错误44会告诉你另一些精彩故事
const long &r2 = patiencelimit; // 没问题幻数有百害而无一利。<code>`</code>
②译者注:字面常量无法取址,它们没有地址。
请使用枚举常量或初始化了的具名常量。