0
#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 的地址时,编译器会抛出一个错误,该错误是一元 & 所需的左值

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

4

4 回答 4

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; 

现在有些东西是一个变量,您可以获取它的地址。

于 2012-10-18T11:22:10.777 回答
1

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

于 2012-10-18T11:17:21.857 回答
1

枚举的成员是常量(就像 3、1000 或 'b'),因此只能用作右值。它们在内存中没有任何位置。

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

于 2012-10-18T11:17:53.797 回答
0

Anenum就像一个整数类型,具有一堆命名文字的额外好处。枚举包含一组命名的整数常量值。

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

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

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

于 2012-10-18T11:19:02.433 回答