幻数
2015-08-29 14:34
253 查看
在c语言中,把直接使用的常数叫做幻数。在编程时,应尽量避免使用幻数,因为当常数需要改变时,要修改所有使用它的代码,工作量巨大,还可能有遗漏。因此通常把幻数定义为宏或枚举。建议使用枚举,因为它是编译阶段存在的符号,编译器的提示会更清晰、更准确。
#define ARRAY_SIZE 10
enum{ARRY_SIZE = 10}
幻数——上下文里出现的字面常量。
幻数带来的主要问题是它们没有(抽象)语义。当我们阅读和维护带有幻数的代码时,不得不去一个个地搞清楚每个光秃秃的量到底代表的是什么意思。没错,这样也能勉强度日,但带来的是不必要的精力浪费以及准确性的丧失。
幻数的另一个不那么显而易见的坏处就是它会以意想不到的方式降低它所代表的类型的精度。
例如:4000, 它实际类型是平台相关的。
另一个字面常量带来的潜在威胁来源于它们没有地址。
给幻数起一个名字。作为一个指导原则,除了0和1之外,程序里出现的任何数大概都可以算作幻数,它们应该有自己的名字。
在其所在作用域有着明确含义的枚举常量,有着不占空间,也没有任何运行期成本的巨大优点。
把数定义为常数,不要定义为宏。C语言的传统方式是使用#define行来对付幻数。C语言预处理程序是一个强有力的工具,但是它又有些鲁莽。使用宏进行编程是一种很危险的方式,因为宏会在背地里改变程序的词法结构。我们应该让语言去做正确的工作(C预处理命令本身不是C语言的组成部分)。
在c/c++里,整数常数可以用枚举语句声明。在C++里,任何类型都可以使用const声明的常数:
在Java里,可以用final声明:
C语言也有const值,但是他们不能用作数组的界。这样,enum就是C中唯一可用的选择了。
#define ARRAY_SIZE 10
enum{ARRY_SIZE = 10}
幻数——上下文里出现的字面常量。
幻数带来的主要问题是它们没有(抽象)语义。当我们阅读和维护带有幻数的代码时,不得不去一个个地搞清楚每个光秃秃的量到底代表的是什么意思。没错,这样也能勉强度日,但带来的是不必要的精力浪费以及准确性的丧失。
1 //这里的一些10分别代表什么意思?? 2 class Portfolio 3 { 4 //... 5 Contact *contracts_[10]; 6 char id_[10]; 7 }; 8 9 ...... 10 11 for (int i = 0; i < 10; ++i) 12 ...
幻数的另一个不那么显而易见的坏处就是它会以意想不到的方式降低它所代表的类型的精度。
例如:4000, 它实际类型是平台相关的。
另一个字面常量带来的潜在威胁来源于它们没有地址。
给幻数起一个名字。作为一个指导原则,除了0和1之外,程序里出现的任何数大概都可以算作幻数,它们应该有自己的名字。
1 class Portfolio 2 { 3 //... 4 enum {maxContracts = 10, idLen = 10}; 5 Contact *contracts_[maxContracts ]; 6 char id_[idLen ]; 7 };
在其所在作用域有着明确含义的枚举常量,有着不占空间,也没有任何运行期成本的巨大优点。
把数定义为常数,不要定义为宏。C语言的传统方式是使用#define行来对付幻数。C语言预处理程序是一个强有力的工具,但是它又有些鲁莽。使用宏进行编程是一种很危险的方式,因为宏会在背地里改变程序的词法结构。我们应该让语言去做正确的工作(C预处理命令本身不是C语言的组成部分)。
在c/c++里,整数常数可以用枚举语句声明。在C++里,任何类型都可以使用const声明的常数:
1 const int MAXROW = 24, MAXCOL = 80;
在Java里,可以用final声明:
1 static final int MAXROW = 24, MAXCOL = 80;
C语言也有const值,但是他们不能用作数组的界。这样,enum就是C中唯一可用的选择了。
相关文章推荐
- jquery 鼠标 滑轮 滚动 方向
- noip2003 神经网络 (拓扑排序,深搜)
- leetcode Implement Trie (Prefix Tree)
- Activity间数据传递与版本兼容问题
- 第二讲实例变量可见度,set/get方法,自定义初始化(代码) 及description的使用
- php中$this、static、final、const、self 等几个关键字的用法
- css去除页面点击链接、按钮触发的虚线框
- Java学习笔记(2):null 和空字符串的区别
- 3维空间旋转3维空间矩阵旋转及旋转变换
- 预测的原理及其实战(2)
- java HashMap那点事
- JavaScript 面向对象继承详解
- noip2003 麦森数 (数论,高精乘单精)
- python中range函数的使用
- Libraries: Performance vs. Native JS
- CSS选择器优先级
- jquery获取ip地址
- 弹窗实验
- 基于Apache POI 向xlsx写入数据
- 基于Apache POI 向xlsx写入数据