循环的终止条件应为减计数到零(count dawn to zero),而不是计数增加到某个特定的限制值。由于减计数结果已存储在条件标志里,与零比较的指令就可以省略了。由于不再使用‘作为数组的下标索引,采用减计数就没有任何问题。
int checksum(int * data)
{
unsigned int i;
int sum = 0;
for( i = 64; i != 0;i --)
{
sum += *(data ++);
}
return sum;
}
对无符号的循环计数值i来说,循环继续的条件既可以是i != 0也可以是i>0 由于i不可能是负数,所以这两个条件是等价的。而对一个有符号的循环计数值来说,用条件i>0来作为继续循环的条件是一件冒险的事情。使用减计数到零的循环结构,这样编译器就不需要分配一个寄存器来保存循环终止值,而且与0比较的指令也可以省略。
总而言之,无论对于有符号还是无符号的循环计数值,都应使用i != 0作为循环的结束条件。对有符号数i,这比使用条件i>0少了一条指令。