#define、const、enum的用法及区别

define,无参宏定义的一般形式为:#define 标识符 字符串(例:#define Max 10)。define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量值只能是字符串或者数字。

①被定义为“宏”的标识符称为“宏名”。在编译处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替代,这称为“宏代替”。宏定义是由源程序中的宏定义命令完成的。宏代替是由预处理程序自动完成的。而宏定义的作用范围仅限于当前文件。

②宏定义有几个优点:一、方便程序的修改  使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可。二、提高计算机的运行效率   使用带参数的宏定义可以完成函数调动的功能,又能减少系统开销,提高运行效率。

③对于宏定义还有几点说明:一、宏定义是用宏名来表示一个字符串,在宏展开时又是以该字符串取代宏名,者之死一种简单的替换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序不会对它作检查。如果有错误,只能在编译已经被宏展开后的源程序时发现。二、宏定义不是说明或者语句,在行末不必增加分号,如加上分号则连分号也一起置换。三、宏定义其作用域为宏定义命令起到源程序结束。如果终止其作用域可使用#undef命令。

const,它是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。关于const的用法总结以下几点:

①函数体内修饰局部变量

例:void main()

{

      const int a=0;

}

const作为一个类型限定词,和int有着相同的地位。const int a;//int const a;是等价的。于是在此处我们应该知道const修饰的对象是谁,是a,和int没关系。const要求他的对象为常量,不可被改变,不可被赋值,不可为左值。

②在函数声明时修饰参数

根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

1、防止修改指针指向的内容

void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。

2、防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 )
指针p1和指针p2指向的地址都不能修改。

3、以上两种的结合。

③修饰函数的返回值

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
例:

const char * GetString(void);
如下语句将出现编译错误:

char *str = GetString();
正确的用法是

const char *str = GetString();

④全局变量

使用extern(extern是计算机语言中的一个函数,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。)

例:extern const double pi;

      const double pi=3.14;

然后其他需要使用pi这个变量的,包含file1.h   #include "file.h"或者复制声明。 

const 的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的作用就是让更多的逻辑错误在编译期被发现。

enum,枚举类型是一种基本数据类型,定义一般为:enum 枚举名{枚举值表};在枚举值表中应罗列出所有可用值。这些值也被称为枚举元素。

①枚举的定义,枚举值是常量,不是变量。不能再程序中用赋值语句在对它赋值。

第一种定义为:

enum box{pencil,pen};  

enum box box2;//或者简写成box box2;  

再有一种就是在声明的时候同时定义。

enum {pencil,pen}box,box2; //在声明的同时进行定义!

如果直接enum box{pencil=3,pen};};//这里pen就是4系统将自动进行pen=4的定义赋值操作。

又如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作

②枚举元素本身由系统定义了一个表示序号的值,从0开始顺序定义为0,1,2,,,。如在weekday中,sun值为0,mon值为1,…,sat值为6。

例:void   main()

{
         enum weekday{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
         a=sun;
         b=mon;
         c=tue;
         printf("%d,%d,%d",a,b,c);
}

说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
a=sum;
b=mon;
是正确的。而:
a=0;
b=1;
是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如:
a=(enum weekday)2;
其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:
a=tue;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值