一个典型的for循环依赖于能够在循环的最后一次迭代之后检测到终止条件。在您的情况下,正如其他答案所指出的那样,i <= 0xff始终为真(假设i是unsigned char类型且UCHAR_MAX==0xff,这是典型情况)。
在任何整数类型的边界附近都可能遇到同样的问题。例如,以下代码:
for (int i = INT_MAX - 9; i <= INT_MAX; i ++) {
}
这(可能)也是一个无限循环(除了对于有符号整数类型的溢出具有未定义行为,而无符号整数具有明确定义的环绕语义,优化编译器可以利用它,但我偏离了主题)。只是不要这样做。
许多解决方案之一是将测试移动到循环的底部,在增量之前:
for (unsigned char i = 0; ; i ++) {
printf("%d\n", i);
if (i == 0xff) break;
}
for
循环的第二个语句是每次迭代之前都会被评估的终止条件。如果您将其留空,则会被视为始终为真,从而产生无限循环(
for (;;)
是简单无限循环的常见习惯用法)。在循环的底部,我们测试
i
是否等于
0xff
。如果是,则我们刚刚执行了最后一次迭代,因此可以跳出循环。
(有些人可能更喜欢在这里使用
while
循环,但我喜欢
for
,因为它允许我们将循环控制变量的声明和增量组合成一个结构。)
(严格来说,
unsigned char
的最大值不一定是
0xff
或
255
,但在您可能遇到的任何系统中都是如此。一些DSP的实现具有
CHAR_BIT > 8
,因此
UCHAR_MAX > 255
。)
unsigned char
最大只能存储0xff
这个值,因此,i <= 0xff
不可能为假。 - François Andrieuxint
。不要对可接受的答案设置愚蠢的限制。 - Benjamin Lindley