有人可以解释这一行吗
Can someone please explain this line
K_count = (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0]) ? ++K_count : 1);
它是 this 简单代码的一部分,我不明白它的工作原理有多精确?
您可以将该单行代码扩展为:
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;
}
(customKey - '0') - 1
这取 customKey
的值,减去“0”的 ASCII 值 (0x30),然后从中减去 1。
CharacterMask[0][x][0]
这取CharacterMask
的第0个元素,取结果的第x
个元素,然后取那个结果的第0个元素。
(byte)x
这会将 x
截断为其 8 个最低有效位。
K_count < x
如果 K_count
小于 x
,则为真(即非零)。
x ? y : z;
如果 x 为真,则结果为 y
,否则结果为 z
。
至于它实际上做什么,那取决于CharacterMask
和customKey
是什么。
这基本上增加了标准美国电话键盘上“3”键的可用选项,在到达最后一个选项后循环回到第一个选项。它通过引用一个 3 维数组来实现,该数组包含每个键的选项,布局为 row/column/options。它的编写方式使其可以在稍作修改后用于其他键。
“...?...:...”结构基本上是 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 维数组。前两个维度表示键盘的行和列。第三维包含该键上可用的选项。例如,电话上的 3 键有 4 个选项(3、d、e 和 f)。出于某种原因,作者还将选项计数作为数组中的第一项(索引 0)。所以 CharacterMask[0][2] 会为您提供一个数组,其中包含数字 4,后跟字符“3”、'd'、'e' 和 'f'。因此,CharacterMask[0][2][0] 将 return 数字 4。类似地,CharacterMask[0][2][1] 将 return 字符“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”字符。这隐式地将两个值都转换为一个字节,并且 returns 是这些字节之间的差异。由于大多数字符集中的数字按 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(又名选项索引)小于选项计数,您仍然可以在不超过最大索引值的情况下加 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;
}
K_count = (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0]) ? ++K_count : 1);
它是 this 简单代码的一部分,我不明白它的工作原理有多精确?
您可以将该单行代码扩展为:
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;
}
(customKey - '0') - 1
这取 customKey
的值,减去“0”的 ASCII 值 (0x30),然后从中减去 1。
CharacterMask[0][x][0]
这取CharacterMask
的第0个元素,取结果的第x
个元素,然后取那个结果的第0个元素。
(byte)x
这会将 x
截断为其 8 个最低有效位。
K_count < x
如果 K_count
小于 x
,则为真(即非零)。
x ? y : z;
如果 x 为真,则结果为 y
,否则结果为 z
。
至于它实际上做什么,那取决于CharacterMask
和customKey
是什么。
这基本上增加了标准美国电话键盘上“3”键的可用选项,在到达最后一个选项后循环回到第一个选项。它通过引用一个 3 维数组来实现,该数组包含每个键的选项,布局为 row/column/options。它的编写方式使其可以在稍作修改后用于其他键。
“...?...:...”结构基本上是 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 维数组。前两个维度表示键盘的行和列。第三维包含该键上可用的选项。例如,电话上的 3 键有 4 个选项(3、d、e 和 f)。出于某种原因,作者还将选项计数作为数组中的第一项(索引 0)。所以 CharacterMask[0][2] 会为您提供一个数组,其中包含数字 4,后跟字符“3”、'd'、'e' 和 'f'。因此,CharacterMask[0][2][0] 将 return 数字 4。类似地,CharacterMask[0][2][1] 将 return 字符“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”字符。这隐式地将两个值都转换为一个字节,并且 returns 是这些字节之间的差异。由于大多数字符集中的数字按 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(又名选项索引)小于选项计数,您仍然可以在不超过最大索引值的情况下加 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;
}