()循环迭代的次数是多少?

时间:2012-03-16 09:54:00

标签: c for-loop 8051 keil

我不确定我是否在这个for循环中遗漏了一些东西。 我希望它能在循环内执行8次代码,这将导致它在LCD上输出8个字符,但是它循环7次,我只看到7个字符。 我正在使用Keil编译器。 请问有人能发现我弄错了吗?

//keycount = 9
for ( iii = (keycount-1),jii = 0; iii > (keycount-8) && jii <8; iii--,jii++)
{
    LCD_Data_Write (jii,Digit_Mask[keybuff[iii]]);
}

2 个答案:

答案 0 :(得分:1)

好的,循环体中的任何内容都不会更改控制它的变量,所以它全部都归结为循环本身。

只需写下初始值并在脑中运行循环:

//keycount = 9
for ( iii = (keycount-1),jii=0; iii>(keycount-8) && jii <8;iii--,jii++)

iii   jii   iii > 1   jii < 8  
---   ---   -------   -------
  8     0      Y         Y        iterate 1
  7     1      Y         Y        iterate 2
  6     2      Y         Y        iterate 3
  5     3      Y         Y        iterate 4
  4     4      Y         Y        iterate 5
  3     5      Y         Y        iterate 6
  2     6      Y         Y        iterate 7
  1     7      N         Y        exit loop

换句话说,它只迭代七次,而不是八次。我怀疑你打算将iii从8减少到1(而不是2)。如果是这种情况,整个循环可以用更简单的东西替换。

// keycount = 9
for (jii = 0; jii < 8; jii++)
    LCD_Data_Write (jii, Digit_Mask[keybuff[8-jii]]);

事实上,即使值的范围从7到0,只需将调用更改为:

LCD_Data_Write (jii, Digit_Mask[keybuff[7-jii]]);

答案 1 :(得分:0)

为了更清楚,通过减去(keycount - 1)来转换数字,就像在大学解决代数方程时一样(它必须对某事有用)今天你知道为什么:-)。你剩下的就是

 for (i = 0; i > -7; i--)

从中很容易看出循环被迭代7次(我从0到-6取值)。我忽略了始终为真的jii<8部分,因此对结果没有贡献。

要回答您错误的问题:它似乎是 off-by-one 错误。您的意思是>=您写的>