#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的新手
答案 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名称,是(唯一)声明的 标识符
所以它只是一个声明。不会分配任何内存。