现在的位置: 首页 > 综合 > 正文

宏定义常量与const定义常量的区别

2018年05月05日 ⁄ 综合 ⁄ 共 1891字 ⁄ 字号 评论关闭

心得:

这两种方式在语法上都是合法的,但是第二种方式要比第一种方式好,因为如果使用#define定义宏,PI会在代码的预编译阶段被预编译处理器替换成3.14159,宏的名称不会出现在符号表中,这样会给代码后期的调试带来麻烦,可能会遇到一个数字,却不知道它从何而来,这就是我们常说的Magic
Number(像拥有魔力一样不知从何而来的数)。使用const定义,既可以保证PI值的唯一性,又便于调试,同时还可以对数据类型进行检查,借助编译器来减少错误的发生。所以,我们总是优先使用const关键字来定义常量。


用宏表示常数

假如我们要写一个有关圆的种种计算的程序,那么∏(3.14159)值会被濒繁用到。我们显然没有理由去改∏的值,所以应该将它当成一个常量对待,那么,我们是否就不得不一遍一遍地写3.14159这一长串的数呢?

必须有个偷懒的方法,并且要提倡这个偷懒,因为多次写3.14159,难免哪次就写错了。

这就用到了宏。宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段。(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议。)今天我们只谈其中代替常数值的功能。

宏的语法为:

 

#define 宏名称 宏值

 

比如要代替前面说到的∏值,应为:

 

#define PAI 3.14159

 

注意,宏定义不是C或C++严格意义上的语句,所以其行末不用加分号结束。

 

宏名称的取名规则和变量名一样,所以我们这里用PAI来表示∏,因为C、C++不能直接使用∏字符。有了上面的语句,我们在程序中凡是要用到3.14159的地方都可以使用PAI这个宏来取代。

作为一种建议和一种广大程序员共同的习惯,宏名称经常使用全部大写的字母。

 

假设原来有一段代码:

 

double zc = 2 * 3.14159 * R; //求圆周长,其中R是代表半径的变量

double mj = 3.14159 * R * R; //求圆面积

 

在定义了宏PAI以后,我们就可以这样使用:

#define PAI 3.14159

 

double = 2 * PAI * R; //求圆周长,其中R是代表半径的变量

double = PAI * R * R; //求圆面积

 

用宏来取代常数,好处是:

 

1)让代码更简洁明了

当然,这有赖于你为宏取一个适当的名字。一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。

2)方便代码维护

就如前面说的3.14159。哪天你发现这个∏值精度不够,想改为3.1415926,那么你只修改一处宏,而不是修改代码中的所有宏。

原来的宏:

#define PAI 3.14159

修改后的宏:

#define PAI 3.1415926

 

对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。完成预处理后,所有原来的“PAI”都成了立即数3.1415926。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。这容易带来一些问题,所以C++使用另一更稳妥的方法来代替宏的这一功能。

常量定义

常量定义的格式为:

 

const 数据类型 常量名 = 常量值;

 

相比变量定义的格式,常量定义必须以 const 开始,另外,常量必须在定义的同时,完成赋值。

 

const float PAI = 3.1415926;

 

const 的作用就是指明这个量(PAI)是常量,而非变量。

常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变PAI的值,比如:

 

const float PAI = 3.14159;

double zc = 2 * PAI * R;

PAI = 3.1415926;        //错误!,PAI不能再修改。

double mj = PAI * R * R; 

 

如果一个常量是整型,可以省略指出数据类型,如:

const k = 100;

相当于

const int k = 100;

 

反过来说,如果不指定数据类型,则编译器将它当成整型。比如:

const k = 1.234;

虽然你想让k等于一个实型数,然而,最终k的值其实是1。因为编译器把它当成整型常量。

我们建议在定义变量时,明确指出类型,不管它是整型或其它类型。

 

const int i = 100;

const double di = 100.0;

ref1:http://www.howzhi.com/course/3687/lesson/43502

ref2:http://www.cnblogs.com/particle/archive/2012/09/01/2667042.html

ref3:http://learn.akae.cn/media/ch21s02.html(宏定义的使用)

抱歉!评论已关闭.