|
发表于 2013-4-18 21:45:52
|
显示全部楼层
guew 发表于 2013-4-18 09:59
诸位,“define 是预处理时替换”,也就是说尽管做了n个#define,但如果在下面的编码中只引用了一个#define ...
这个概念是混淆和糊涂的,根本没有说到点子上。这里有几个层面的基础知识,分析如下。
1、首先要明白什么是变量、什么是常量,他们有什么区别。
变量和常量的本质区别是:在计算机系统的内存RAM中,变量是分配存储空间的;常量不会在RAM内存中分配存储空间的。不知道各位学过8086的微机原理吗?从汇编角度看如下的代码:
var1 db 3 ===>var1是变量,在内存中分配空间,假定地址为1000h,因此意味在在内存地址1000H的单元中,存放一个数值3
var2 equ 3 ===>var2是常量,相当C语言的#define var2 3,定义一个常量。VAR2在内存中没有分配空间。简单的讲,此时对于编译器讲,VAR2就是常数3
进一步理解看下面两条c语言语句的区别,
C语句 ==》为对应的汇编 --> 真正的机器汇编代码(预处理,编译过)
B = var1 ==》 mov al, var1 ---> mov al, [1000h] ; 功能是把内存单元3000H处的值取出到AL寄存器中,属于直接寻址
B = var2 ==》 mov al, var2 ---> mov al, 3 ; 功能是把立即数3放入AL寄存器中,属于立即数寻址。
可以清楚的看出,第2句的3,其实是在指令中的(也可以理解在flash中,但不全面。因为程序员也是可以在FLASH中定义变量的,只是这些变量的值不能更换,比如固定的7段码表,但它在flash中是有地址存储的,是通过地址读取的。而此句常量3,是指令的一部分,与变量属于完全不同的概念,不能理解它在flash中有专门的存储地址)
2、只有清楚的理解上面的概念,才能理解枚举与常量的不同。
2.1 枚举是一个变量,因此在存储器中必须给枚举变量分配空间地址。比如我们定义下面的枚举变量:
enum {sun,mon,tue,wed,thu,fri,sat} workday;
则表示,在内存中分配一个单元给枚举变量workday,这个同普通变量定义是相同的,但不同点是这个变量的赋值只能在0-6之间(此时sun代表常数0,mon代表常数1.....)
2.2
正确的给枚举变量赋值应该是 workday = mon; workday = fri,但不能写成 workday = 1。这个规则是由编译器检查的。
2.3
最后,在理解上面的概念后,我们可以知道, workday = mon 相当于 workday = 1 ,给变量赋值一个常数。只是由于枚举的限制,只能写成workday = mon.
{sun,mon,tue,wed,thu,fri,sat}实际上也是定义和代表了常数0,1,2,3...6,只是这些常数定义只能给workday变量赋值和判断使用(编译器控制)
既然sun,mon,tue,wed,thu,fri,sat是常数,在内存中也不会分配空间,一条C语言:
C语句 ==》 为对应的汇编 --> 真正的机器汇编代码(预处理,编译过)
workday = mon ==》 mov al, mon ---> mov al, 1 ; 功能是把立即数1放入AL寄存器中,属于立即数寻址。这里的1是指令的一部分了,与常量类似。
=========================================
不知道我解释的清楚吗? |
|