2016-12-29 102 views
-1

我在讀從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

它只是意味着'JSON_NULL'是15,沒有什麼好笑的是 – harold

+4

當一個枚舉入口沒有明確的值分配給它時,它會比分配給前一個入口的值多一個。 – jaggedSpire

+0

@Quentin我認爲你的編輯方式改變了這個問題。OP似乎不明白JSON_前綴的意義。 –

回答

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對象類型。

+0

謝謝,真的爲我清除它! –

5

這很簡單。枚舉值可以明確指定或隱式定義。當明確指定時 - 例如JSON_NULL - 他們只是有這個值。在這種情況下,它是15.(不知道爲什麼在這裏使用花式十六進制符號)。

當隱含分配,他們總是等於先前的枚舉值+ 1,第一個值被設置爲0。

而且,爲了以防萬一,全名是定義在那裏。不NULL,但JSON_NULL,不NUMBER,但JSON_NUMBER

0

0xF僅有15以十六進制(十進制) - 什麼特別的地方。枚舉條目要麼顯式賦值,要麼先前條目的值加1。這裏沒有什麼奇怪的,枚舉只有6個值從0到5,然後最終值編號爲15.共計7個值,編號爲0,1,2,3,4,5,15。爲什麼這個編號?我不知道;問任何寫代碼的人。

0
  • 這是否意味着NULL被定義爲半字節1111?

否,在一般情況下,除非明確指定底層枚舉類型是一個int。這種情況下的值只是0xF - 在那裏沒有半字節。

  • 這是否意味着在數量和NULL之間的每一個值是0和0xF之間?

它將從JSON_NUMBER = 0開始並增加一個,直到JSON_FALSE,然後JSON_NULL這將是0xF

  • 這是否意味着NULL是某種內存位置的?

  • 什麼會STRING,ARRAY的價值......是什麼?

如前所述。

  • 爲什麼要用這種方式聲明一個枚舉?

通常爲具有可被用作undefinedinvalid的值。它可以表示執行某個函數時發生錯誤,因此枚舉值未設置爲有效條目。