宏,枚举,常量的区别

来源:互联网 发布:蹭网器淘宝叫什么 编辑:程序博客网 时间:2024/06/11 04:09

宏和常量都是C层级的,其中宏是预处理过程的。真正到编译的时候宏已经没了。

先来介绍一下宏的定义:

宏定义是C语言提供的3种预处理功能的一种,这3种预处理包括:宏定义、文件包含、条件编译。宏定义又称为宏代换、宏替换,简称"宏"。

宏的格式:
#define 标识符 字符串,其中的标识符就是所谓的符号常量,也称为宏名。掌握"宏"概念的关键是"换"。一切以换为前提、做任何事情之前先要换,准确理解之前就要"换"。
即在对相关命令或语句的含义和功能作具体分析之前就要换

例:
(1)#define Pi 3.1415926
把程序中出现的Pi全部换成3.1415926

(2)#define N 10
printf("%d\n", N);
最后交给编译器的是
printf("%d\n", 10);


关于宏的几点说明:

1.宏名一般用大写。

2.使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。

3.宏定义末尾不加分号。

4.宏定义不存在类型问题,它的参数也是无类型的。

5.宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。


const是c语言的关键字,它限定一个变量不允许被改变,使用const在一定程度上可以提高程序的安全性和可靠性。

const定义:常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。

const目的:const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

const主要作用:

1.可以定义const常量,具有不可变性。例如:const int Max=100; Max++会产生错误;

2.便于类型检查,是编译器对处理内容有更多了解,消除了一些隐患。

例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改;

3.可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。

如1中,如果想修改Max的内容,只需要const int Max=you want即可。

4.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。还是上面的例子,如果在函数体内修改了i,编译器就会报错;例如: void f(const int i) { i=10;//error! }


指针使用const

(1)指针本身是常量不可变。

         char* const pContent; 

(2)指针所指向的内容是常量不可变。

         const char *pContent; 

(3)两者都不可变。

          const char* const pContent; 

(4)还有其中区别方法,沿着*号划一条线

         如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为           常量;
        如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。


函数中使用const

const修饰函数参数
a.传递过来的参数在函数内不可以改变

void function(const int Var);

b.参数指针所指内容为常量不可变

void function(const char* Var);

c.参数指针本身为常量不可变

void function(char* const Var);

d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:

void function(const Class& Var); //引用参数在函数内不可以改变
void function(const TYPE& Var); //引用参数在函数内为常量不可变


枚举

枚举在C/C++/c#中,是一个被命名的整型常数的集合,枚举在日常生活中很常见。例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是一个枚举。

枚举的形式为:

enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
} 枚举变量;
如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始, 顺次赋给标识符0, 1, 2, ...。但当枚举中的某个成员赋值后, 其后的成员按依次加1的规则确定其值。

例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。

当定义改变成:
enum Num
{
x1,
x2=0,
x3=50,
x4
}x;
则x1=0, x2=0, x3=50, x4=51,因为x3已被赋值为50,所以其后的成员依次加1,所以x4=x3+1=50+1=51。

注意:1. 枚举中每个成员(标识符)结束符是",", 不是";", 最后一个成员可省略","。
2. 初始化时可以赋负数, 以后的标识符仍依次加1。
3. 枚举变量只能取枚举说明结构中的某个标识符常量。
例如:
enum Num
{
x1=5,
x2,
x3,
x4
};
enum Num x=x3;
此时, 枚举变量x实际上是7。


枚举类型变量的赋值和使用

枚举类型在使用中有以下规定:

1.枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值: sun=5;mon=2;sun=mon; 都是错误的。

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

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);
}

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


随着计算机的不断普及,程序不仅只用于数值计算,还更广泛地用于处理非数值的数据。例如:性别、月份、星期几、颜色、单位名、学历、职业等,都不是数值数据。 在其它程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中用自然语言中有相应含义的单词来代表某一状态,则程序就很容易阅读和理解。也就是说,事先考虑到某一变量可能取的值,尽量用自然语言中含义清楚的单词来表示它的每一个值,这种方法称为枚举方法,用这种方法定义的类型称枚举类型。



原创粉丝点击