7

i如果必须是一个,那么在不进入无限循环的情况下执行类似于此的操作的优雅方法是什么unsigned char

for (unsigned char i = 0; i < 256; ++i) {
    printf("%d\n", i); 
}   
4

3 回答 3

18
unsigned char i = 0;
do {
    printf("%u\n",i);
}while(++i != 0);

在循环测试中进行增量并针对包装值进行测试。

于 2012-10-30T13:06:08.193 回答
3

作为一般经验法则:如果您的迭代器变量需要保存 0 到“Uxxx_MAX”之间的所有值,那么您为算法选择了一个太窄的类型。

您应该考虑uint16_t改用。

在很多情况下,您不能使用大的 int 类型来代替 unsigned char。所以让我问你,你的应用程序是为 8 位 MCU 编写的实时嵌入式系统,你发现这个循环本身就是性能瓶颈吗?

  • 如果是,则编写一个不知名的循环,uint8_t并将其作为迭代器的类型,并注释您这样做的原因。
  • 如果否,则使用uint16_t或更大的整数类型。
于 2012-10-30T14:16:35.810 回答
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在那里替换它仍然有效。

于 2012-10-30T13:53:06.127 回答