你能解释这个枚举声明吗?

时间:2016-12-29 20:57:25

标签: c++ enums

我正在阅读JsonParser的代码,我想知道这个枚举是如何工作的:

enum JsonTag {
    JSON_NUMBER = 0,
    JSON_STRING,
    JSON_ARRAY,
    JSON_OBJECT,
    JSON_TRUE,
    JSON_FALSE,
    JSON_NULL = 0xF
};
  • 这是否意味着NULL被定义为半字节1111

  • 这是否意味着NUMBERNULL之间的每个值都介于00xF之间?

  • 这是否意味着NULL是某种记忆位置?

  • STRINGARRAY的价值是什么?

  • 为什么用这种方式声明枚举?

4 个答案:

答案 0 :(得分:5)

很简单。可以显式指定或隐式定义枚举值。明确指定时 - 例如您的示例中的# ---callback functions--- def select_button(): btn.config(bg='green', activebackground='green', relief=SUNKEN) # ---main--- # List of buttons to be created list = ['A', 'B', 'C'] buttons = [] # Create buttons for i, name in enumerate(list, 2): btn = Button(root, text=name, command=select_button) btn.grid(row=i, column=0, sticky=W) buttons.append(btn) - 他们只是拥有此值。在这种情况下它是15.(不知道为什么在这里使用花式十六进制表示法。)

当隐式指定时,它们总是等于先前的枚举值+ 1,第一个值设置为0.

而且,以防万一,那里定义了全名。不是JSON_NULL,而是NULL,不是JSON_NULL,而是NUMBER等。

答案 1 :(得分:3)

  

这是否意味着JSON_NULL定义为半字节1111?

值0x0F(十六进制)十进制为15,二进制为1111。

  

这是否意味着JSON_NUMBER和JSON_NULL之间的每个值都介于0和0xF之间?

不一定。分配的enum值与范围无关 当enum标识符没有特定值时,它将使用前一个值+ 1.

  

这是否意味着JSON_NULL是某种内存位置?

您可以获得的唯一含义是标识符JSON_NULL被赋值为15.没有任何内容表明任何标识符的用途。

  

JSON_STRING,JSON_ARRAY的价值是什么?

以下是标识符的值:

enum JsonTag {
/* 0 */    JSON_NUMBER = 0,
/* 1 */    JSON_STRING,
/* 2 */    JSON_ARRAY,
/* 3 */    JSON_OBJECT,
/* 4 */    JSON_TRUE,
/* 5 */    JSON_FALSE,
/* 15 */    JSON_NULL = 0xF
};
  

为什么用这种方式声明枚举?

一个原因是具有顺序符号,并允许符号不是连续的。也许作者没有定义15个符号,只有前6个。JSON_NULL似乎有一个15的特殊值,因此它以这种方式列出。

您可能希望在json数据规范中探索JSON对象类型。

答案 2 :(得分:0)

0xF只是15(十进制)的十六进制表示法 - 没什么特别的。枚举条目具有显式指定的值或前一个条目的值加1。这里没有什么奇怪的,enum只有6个值编号为0到5,然后是最终值编号为15. 7个值总共编号为0,1,2,3,4,5,15。为什么这个编号?我不知道;问问谁写了代码。

答案 3 :(得分:0)

  
      
  • 这是否意味着将NULL定义为半字节1111?
  •   

不,通常,除非明确指定,否则底层枚举类型为int。这种情况下的值只是0xF - 没有半字节。

  
      
  • 这是否意味着NUMBER和NULL之间的每个值都介于0和0xF之间?
  •   

它将从JSON_NUMBER = 0开始并增加1直到JSON_FALSE,然后对于JSON_NULL它将是0xF

  
      
  • 这是否意味着NULL是某种内存位置?
  •   

没有

  
      
  • STRING,ARRAY ......的价值是什么?
  •   

如前所述。

  
      
  • 为什么要用这种方式声明枚举?
  •   

通常具有可用作undefinedinvalid的值。它可以表示执行函数时出错,因此枚举值未设置为有效条目。