【问题标题】:enum is constant or const varibale or anything else ? getting error in the following codeenum 是常量还是常量变量或其他任何东西?在以下代码中出现错误
【发布时间】:2023-04-09 17:30:02
【问题描述】:
#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的新手

【问题讨论】:

    标签: c enums constants


    【解决方案1】:

    看看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; 
    

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

    【讨论】:

    • 你“可以”初始化一个枚举列表。
    • @PrototypeStark - 是的...我不是说你不能做到吗?
    【解决方案2】:

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

    【讨论】:

    • 无论如何,它们一定在内存中的某个地方吗?
    • @Omkant 是的,但不清楚在哪里。它们要么作为数字常量存储在内存的只读部分中,要么更有可能存储为实际二进制程序代码的一部分。例如,如果您编写 if(something == a),实际上您编写的是 if(something == 0),编译器可能会将其转换为实际可执行文件中的单个汇编指令:“如果为零则分支”。常数 a(值 0)是“零时分支”指令的一部分。
    • @Stark:这意味着枚举只是我们为人类可读性提供的命名常量,对吧?否则它与 2,3,4 一样的整数
    • @Omkant 它们在编译器的内存中。 a 是一个常数值;它不存在于您的程序内存中的任何地方。 if(something == a) 是代码……它确实 存在于程序的内存中。 key dd 定义为同样存在于内存中的变量。
    • @Omkant,是的。这就是为什么他们在程序中没有地址。它们用于可读性。 C 中的枚举有助于提高可读性。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多