有人可以解释这一行

时间:2015-05-06 16:52:55

标签: c arduino

K_count = (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0]) ? ++K_count : 1);

它是this简单代码的一部分,我无法理解它的精确程度如何?

3 个答案:

答案 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 :(得分:1)

(customKey - '0') - 1

这取customKey的值,减去ASCII值“0”(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

至于它实际上做什么,这取决于CharacterMaskcustomKey是什么。

答案 2 :(得分:1)

这基本上通过标准美国电话键盘上的可用选项递增,用于&#34; 3&#34;键,在到达最后一个选项后循环回第一个选项。它通过引用一个三维数组来实现,该数组包含作为行/列/选项的每个键的选项。它以这样的方式编写,即只需稍加修改就可以重用其他键。

&#34; ......?...:......&#34; construct基本上是if / else的快捷方式。所以你可以像这样重写语句:

if (K_count < (byte)(CharacterMask[0][(customKey - '0') - 1][0])) {
    K_count = ++K_count;
} else {
    K_count = 1;
}
&#34; ++&#34;运算符只需向变量添加1,因此您可以重写为:

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

CharacterMask是一个描述典型电话键盘的三维数组。前2个维度表示键盘的行和列。第三个维度包含该键上可用的选项。因此,例如,电话上的3键有4个选项(3,d,e和f)。由于某种原因,作者还将选项计数作为数组中的第一项(索引0)。所以CharacterMask [0] [2]会给你一个数组,其中包含数字4,然后是字符&#39; 3&#39; d&#39;&#39; e&#39;和& #39; F&#39 ;.因此,CharacterMask [0] [2] [0]将返回数字4.类似地,CharacterMask [0] [2] [1]将返回char&#39; 3&#39;。因为这行代码只关心选项的数量而不是它们的值,所以最终的数组索引被硬编码为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是char而不是数字,我们可以使用&#34; - &#34;运算符减去&#39; 0&#39; 0焦炭。这隐式地将两个值都转换为一个字节,并返回这些字节之间的差异。由于在大多数字符集中数字的排序为0-9,这有效地获得了存储在customKey变量中的字符的数值(例如,char 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;
}

因为在基于零的索引列计数中,在列0,1,2中找到了键1,2,3,我们需要从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;
}