循环使用unsigned char
如果i
必须是一个unsigned char
,那么在不进入无限循环的情况下执行与此类似的东西的优雅方式是什么?
for (unsigned char i = 0; i < 256; ++i) { printf("%d\n", i); }
unsigned char i = 0; do { printf("%u\n",i); }while(++i != 0);
在循环测试中进行增量并针对包装值进行测试。
作为一般经验法则:如果你的迭代器变量需要保存0到“Uxxx_MAX”之间的所有值,那么你选择了一个太窄的算法类型。
您应该考虑使用uint16_t
。
在很多情况下,您不能使用大型int类型而不是unsigned char。 那么让我问你,你的应用程序是一个为8位MCU编写的实时嵌入式系统,你发现这个循环是一个性能瓶颈吗?
- 如果是,那么用
uint8_t
作为迭代器的类型编写一个模糊的循环,并注释你为什么这样做。 - 如果不是,则使用
uint16_t
或更大的整数类型。
将检查放在身体之后和增量之前
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
,它仍然有效。