• 对enum的探讨


    最近在看《Linux C编程一站式学习》,在83页上看到了这么一句话“枚举的成员名却和变量名在同一个命名空间中,
    所以会出现命名冲突”。忽然感觉C语言中枚举是有点”猫腻“的。由于当时在图书馆所以只能先用自己这不好用的
    脑袋先来猜想一下枚举的实现:枚举的每个成员实际是一个变量,他被赋予了相应的值,由于枚举的每个成员
    实际代表着0,1,2这样的整数值,所以进一步猜想枚举的每个成员是一个int类型的变量。所以有了枚举的这些特性:
    1)变量名不能和枚举成员重名
    2)枚举成员实际对应着0,1,2这样的整数
    3)不同的成员可以对应着同一个整数(相当与int a,b;a=b=1;)


    可是这毕竟是我的猜想,对不对还要在电脑上测试一下。

    1.   


    #include <stdio.h>
    int main()
    {
    enum a {b,c};
    enum d {e,f};

    return 0;
    }
    先敲上如上的代码(我用vc6.0,因为调试方便。。。想鄙视的就尽情的鄙视吧... )
    然后用debugger查看b和e的地址结果却是:00000000,00000000
    地址怎么会相同呢?(其实高手估计已经猜到了怎么回事,不过我太菜,还是不明白)


    赋值一下试试
    #include <stdio.h>
    int main()
    {
    enum a {b=256,c};
    enum d {e=256,f};

    return 0;
    }
    结果b的e的地址都为00000100,还是相同。


    为什么会有相同的地址呢,这个地址是什么意思呢?


    在后来的调试中,突然注意到了一个词:constant


    是的,没错就是constant!b、c、e和f其实constant,是对整形常量的取别名,这样就可以解释上面的一切了,
    调试的时候我输入b和e被解释为对应的常数了,等于直接查看了地址。。。。。。


    好吧,现在来验证一下b、c、e和f是整形常量


    这个为b赋值为1是错误的,而且说明了b不是左值
    #include <stdio.h>
    int main()
    {
    enum a {b=256,c};
    enum d {e=256,f};

    int i=b;

    b=1;       //error C2106: '=' : left operand must be l-value

    return 0;
    }


    这个程序是正确的:
    #include <stdio.h>
    int main()
    {
    enum a {b=256,c};
    enum d {e=256,f};

    enum a g=b;    //b是enum a中定义的
    enum a h=e;    //e是enum d中定义的!!!

    int i=b;

    printf("%d\t%d\t%d\n",g,h,i);
    return 0;
    }
    输出:256256   256


    总结:其实所谓的枚举就是对int取个别名,如enum a{};和typedef int int_;是相同的效果。而枚举{}中的成员实际就是对相应的整形常量进行了取别名,
    就是#define b 256这样的效果罢了。而且这些别名在对应的作用域可以和整形常量一样使用。


    再来个例子
    #include <stdio.h>  //改程序没有问题(vc6.0和codeblocks)
    #define one 1
    int main()
    {
    enum a {b=256,c=one};
    enum d {e=256,f};
    typedef int int_;


    int_i;
    enum a j;
    intk;


    i=e;
    j=e;
    k=e;


    i=j;
    j=i;
    k=j;
    j=k;
    i=k;
    k=i;


    i=0;
    j=0;
    k=0;
    return 0;
    }


    学习中的一己之见,如有错误,请务必指出,感谢!

  • 相关阅读:
    git基本操作及设置
    5-13 多页面打包配置
    笔记待整理
    单例模式在多线程下的多种实现模式
    面试题小练习1106
    求两个字符串的最大共有子串
    单例模式
    静态初始化一个二维数组并将二维数组排序并输出
    java中数组的基本知识
    关于break语句如何结束多重循环的嵌套
  • 原文地址:https://www.cnblogs.com/svking/p/enum.html
Copyright © 2020-2023  润新知