2015-05-06 145 views
-2
K_count = (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0]) ? ++K_count : 1); 

它是this簡單代碼的一部分,我不明白它的工作有多精確?有人可以請解釋這一行

+2

注:'++ K_count'應該是'K_count + 1' [序列分] – wildplasser

回答

1

這基本上是通過標準美國電話鍵盤上的「3」鍵的可用選項遞增,在達到最後一個鍵後循環回第一個選項。它是通過引用一個3維數組來實現的,該數組包含作爲行/列/選項佈置的每個鍵的選項。它的寫法是這樣的,它可以通過微小的修改重新用於其他鍵。

「...?...:...」構造基本上是if/else的快捷方式。這樣你就可以改寫該語句是這樣的:

if (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0])) { 
    K_count = ++K_count; 
} else { 
    K_count = 1; 
} 

的「++」操作員只需加1到可變,所以可以改寫爲:

if (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0])) { 
    K_count = K_count + 1; 
} else { 
    K_count = 1; 
} 

CharacterMask是一個3維數組,它描述了典型的電話鍵盤。前2個維度指示鍵盤的行和列。第三個維度包含該密鑰上可用的選項。所以,例如,電話上的3鍵有4個選項(3,d,e和f)。出於某種原因,作者還將選項計數作爲數組中的第一項(索引0)。所以CharacterMask [0] [2]會給你一個包含數字4,後跟字符'3','d','e'和'f'的數組。因此,CharacterMask [0] [2] [0]將返回數字4。類似CharacterMask [0] [2] [1]將返回字符'3'。因爲這行代碼是唯一真正關心的選項,而不是它們的值數,最終的數組索引是硬編碼爲0。鑑於這種情況,你可以重寫代碼,這樣的澄清:

rowIndex = 0; 
columnIndex = (customKey - '0') - 1; 
optionCountIndex = 0; 
if (K_count < (byte)(CharacterMask[rowIndex][columnIndex][optionCountIndex])) { 
    K_count = K_count + 1; 
} else { 
    K_count = 1; 
} 

由於customKey是一個字符而不是數字,我們可以使用「 - 」運算符來減去'0'字符。這隱式地將這兩個值轉換爲一個字節並返回這些字節之間的差異。由於數字在大多數字符集中被排序爲0-9,所以這有效地得到了存儲在customKey變量中的字符的數值(例如,字符3變爲字節3)。因此代碼可以如下重寫:

rowIndex = 0; 
keyNumber = (customKey - '0'); 
columnIndex = keyNumber - 1; 
optionCountIndex = 0; 
if (K_count < (byte)(CharacterMask[rowIndex][columnIndex][optionCountIndex])) { 
    K_count = K_count + 1; 
} else { 
    K_count = 1; 
} 

因爲它們鍵1,2,3中,在基於零索引的列計數的列0,1,2被發現,我們需要從keyNumber減去1得到如上所示的列索引

因爲CharacterMask是一個char數組,所以我們需要將第一個值轉換爲一個字節以獲取初始輸入的值。這個重寫澄清:

rowIndex = 0; 
keyNumber = (customKey - '0'); 
columnIndex = keyNumber - 1; 
optionCountIndex = 0; 
optionCountAsCharType = (CharacterMask[rowIndex][columnIndex][optionCountIndex]); 
if (K_count < (byte)optionCountAsCharType) { 
    K_count = K_count + 1; 
} else { 
    K_count = 1; 
} 

與K_count比較依賴於一個事實,即選項陣列長度等於選項計數加1,因爲它是基於零的索引,這意味着最後的索引等於選項數量。所以只要當前的K_count(aka選項索引)小於選項數量,您仍然可以添加1而不超過最大索引值。但是如果您位於最後一個索引處,則必須回滾到1(第一個選項的索引)。它可以作出一個更重構更加清晰:

rowIndex = 0; 
keyNumber = (customKey - '0'); 
columnIndex = keyNumber - 1; 
optionCountIndex = 0; 
optionCountAsCharType = (CharacterMask[rowIndex][columnIndex][optionCountIndex]); 
nextIndexIsInsideArrayBounds = K_count < (byte)optionCountAsCharType 
if (nextIndexIsInsideArrayBounds) { 
    K_count = K_count + 1; 
} else { 
    K_count = 1; 
} 
+0

OP:如果你喜歡我的回答,請接受它 –

+0

謝謝非常努力,很好的解釋! –

1

可以展開的代碼到該單條線:

int temp = (byte)(CharacterMask[0][(customKey - '0') - 1][0]); 
if (K_count < temp) 
{ 
    K_count = ++K_count; 
    // This is bad. See the comment about sequence points. 
    // It should be 
    K_count = K_count + 1; 
} 
else 
{ 
    K_count = 1; 
} 
1
(customKey - '0') - 1 

這需要的customKey值,減去 「0」(的0x30)的ASCII值,然後減去從那個1。

CharacterMask[0][x][0] 

這需要的CharacterMask第0個元素,取結果的第x元件,然後採取的結果第0個元素。

(byte)x 

此截斷x其8至少顯著位。

K_count < x 

這是真實的(即,非零)如果K_count小於x

x ? y : z; 

這導致y如果x是真實的,否則它會導致z

至於它究竟是什麼確實,這取決於什麼CharacterMaskcustomKey是。