如果i
必须是unsigned char
,那么在不进入无限循环的情况下执行与此类似的内容的优雅方法是什么?
for (unsigned char i = 0; i < 256; ++i) {
printf("%d\n", i);
}
答案 0 :(得分:17)
unsigned char i = 0;
do {
printf("%u\n",i);
}while(++i != 0);
在循环测试中进行增量并针对包装值进行测试。
答案 1 :(得分:3)
作为一般经验法则:如果你的迭代器变量需要保存0到“Uxxx_MAX”之间的所有值,那么你选择了一个太窄的算法类型。
您应该考虑使用uint16_t
代替。
有很多情况下无法使用大型int类型而不是unsigned char。那么让我问你,你的应用程序是一个为8位MCU编写的实时嵌入式系统,你发现这个循环是一个性能瓶颈吗?
uint8_t
作为迭代器类型的模糊循环,并注释为什么要这样做。 uint16_t
或更大的整数类型。答案 2 :(得分:1)
将检查放在正文之后和增量之前
for (unsigned char i = 0; ; ++i) {
printf("%d\n", i);
if(i==255)
break;
}
但是你可能会做一段时间:
unsigned char i = 0;
while( ) {
printf("%d\n", i);
if(i==255)
break;
++i;
}
甚至推开检查:
for (unsigned char i = 0; i++ < 255; ) {
printf("%d\n", i);
}
所有这些都在增量之前检查255,而不是之后检查零,所以如果变量是CHAR或某个当前限制为256但可以更改的宏,这些仍然可以工作,因为它们不会依靠溢出。在那里替换int
,它仍然有效。