枚举是常量还是常量变量还是其他什么?在以下代码中获取错误

时间:2012-10-18 11:15:43

标签: c enums const

#include<stdio.h>

typedef enum {a,b,c}key;

int main()
{
 key d=3;
 printf("%p\n,&a);
 printf("%p\n",&d);
 printf("%d\t %d\t %d\t %d\n",a,b,c,d);
 return 0;
}

当我尝试获取a或b或c的地址时 编译器抛出一个错误,即一元&amp;

所需的左值

我没有得到它,因为它适用于相同类型的d。 这里发生了什么?是这些常量还是由编译器赋值为0 1和2的const varibales。 因为这种错误我们只得到常数。 请帮忙,我是C的新手

4 个答案:

答案 0 :(得分:4)

查看enum到底是什么。这是一个价值。请记住,如果您没有初始化枚举列表,则第一个列表的值为0

考虑布尔枚举示例:

typedef enum /* Declares an enumeration data type called BOOLEAN */
{
    false,     /* false = 0, true = 1 */
    true 
}BOOLEAN ; 

因此枚举“false”为0.你不能取0的地址,但是如果你从中做出一个“BOOLEAN”:

BOOLEAN something = false; 

现在有些东西是变量,你可以拿出那个地址。

答案 1 :(得分:1)

a,b,c是枚举中常量整数的符号。他们不是拥有地址的变量。因此&amp;不能在这里使用(这意味着只有右值)。

答案 2 :(得分:1)

枚举的成员是常量(就像3,1000或'b'),因此只能用作rvalues。他们在记忆中没有任何位置。

但是d是一个变量,其值是枚举成员之一(尽管不一定)。 d有一个明确定义的内存位置,可以用作左值(我们可以使用它的地址,修改它等)。

答案 3 :(得分:0)

enum就像一个整数类型,还有一堆命名的文字。枚举包含一组命名的整数常量值。

来自C标准C99。第6.7节语义,第3点:

  

表示枚举常量或typedef名称,是(唯一)声明的       标识符

所以它只是一个声明。不会分配任何内存。