c语言学习笔记(5)enum和typedef分析

摘要:总结了enum和typedef的含义,以及他们和define的区别。


一、enum是什么

    enum是一种自定义类型,其默认的常量在前一个值的基础上加1,如果不给默认的常量赋值,那么第一个常量默认取0,后面依次加1,enum定义的变量,只能取定义时候的离散值。

    可以编写程序验证,验证程序如下:

<span style="font-size:18px;">#include <stdio.h>
 
enum colour
{
    green,
    red,
    blue
    };
 
enum number
{
    one,
    two=2,
    three
    };
   
enum date
{
    mon=1,
    tues,
    thur
    };
   
int main(void)
{
    printf("%d\n",green);
    printf("%d\n",red); 
    printf("%d\n",blue);
      
    printf("%d\n",one);
    printf("%d\n",two);
    printf("%d\n",three);
          
    printf("%d\n",mon);
    printf("%d\n",tues);
    printf("%d\n",thur);
 
                        
    return0;
    }</span>

最终编译运行结果如下:

    可以看到,对应的三个enum,打印出来的值,正好就是我们上面解释的enum的意义。前三行,我们没有给enum中的任何常量给值,所以默认输出012;然后我们第二个enum中,只给第二个值一个2,第一个没有给,还是默认0,第三个会在第二个的基础上加1;最后三个输出是我们给第一个常量为1,后面依次加1,所以输出123。另外,如果我们对enum中的常量,取地址,是不对的,因为常量没有地址。


二、枚举类型和define的区别

    1.define宏常量只是简单的进行值替换,枚举类型常量是真正意义上的常量。

    2.define宏常量无法被调试,枚举类型可以。

    3.define宏常量没有类型信息,而枚举类型是特定类型的常量。

    要区分它们,首先要清楚编译器如何处理define宏的,比如我们在一个程序的开始定义一个define宏:define LENGTH 15,然后下面我们直接使用LENGTH的时候,就会变成15。编译器在处理的时候,会先进行一个文本上的替换,就是查找程序中的所有的LENGTH,然后依次替换成15,然后再进行编译,所以这是一个简单的值的替换,因为编译的时候已经没有define了,我们自然无法进行调试,同时15这个数字也没有特定的类型信息,像刚才我们定义的colour,number和date都是一个类型。


三、typedef是什么

    typedef用于给一个已经存在的数据类型进行重命名,它并不会定义一个新的类型出来,typedef重定义的类型不能是unsigned和signed的扩展。

    比如我们使用:typedef int INT32,那么INT32其实就变成了int,我们可以使用它去定义别的变量。


四、typedef和define的区别

    typedef是给已有的变量取别名,#define是简单的字符串替换,可以看下面国嵌老师给出的一个例子,很有意思:

    typedef char* PCHAR

    PCHAR P1,P2;

    #define PCHAR char*

    PCHAR P3,P4;

    这里,最终结果是P1,P2,P3是char型的指针,而P4是一个char型变量,为什么呢,因为在typedef里面,PCHAR是char*的别名,也就是P1,P2同时属于PCHAR类型的变量,就好比我们定义int a,b;用一个类型同时定义多个变量,没有问题。但是define只是简单地字符串变换,在PCHAR P3,P4的时候,替换成了char*P3,P4。所以,P3变成了char型的指针,而P4就是一个char型的变量。

    这篇帖子,就总结到这里吧,如有不正确的地方还请指出,大家共同进步。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值