我正在阅读JsonParser
的代码,我想知道这个枚举是如何工作的:
enum JsonTag {
JSON_NUMBER = 0,
JSON_STRING,
JSON_ARRAY,
JSON_OBJECT,
JSON_TRUE,
JSON_FALSE,
JSON_NULL = 0xF
};
这是否意味着NULL
被定义为半字节1111
?
这是否意味着NUMBER
和NULL
之间的每个值都介于0
和0xF
之间?
这是否意味着NULL
是某种记忆位置?
STRING
,ARRAY
的价值是什么?
为什么用这种方式声明枚举?
答案 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 ......的价值是什么?
如前所述。
- 为什么要用这种方式声明枚举?
通常具有可用作undefined
或invalid
的值。它可以表示执行函数时出错,因此枚举值未设置为有效条目。