我想使用字节变量i
来执行256次代码。下面的行无限循环,有一个整洁的替代品可以工作吗?
for (i = 0; i < 255; i++){
希望不使用:
while(1)
break;
陈述由于
答案 0 :(得分:10)
i = 0;
do {
f(i);
} while(i++!=255);
答案 1 :(得分:5)
始终可以这样做:
for (i = 0; i != 255; ++i)
{
f(i);
}
f(255);
老实说,你最好只使用int
。如果你使用8位整数,它不会更快。无论如何它都会在寄存器中。
答案 2 :(得分:3)
uint8_t i = 0;
do {
...
} while ((++i) != 0);
当然,假设i
会溢出。这不是C标准所保证的,但几乎总是在编译器没有过度优化的情况下发生。
答案 3 :(得分:1)
我能想到的唯一方法就是拥有一个布尔值
b = 1;
for(i = 0; i != 0 || b; i++)
{
b = 0;
...
}
或者你可以使用短路,这是一个字节大小的2倍。
发生的事情是最大无符号字节值是255.我不确定无符号字节会发生什么,但是当你溢出时有符号字节会变为负数。
答案 4 :(得分:1)
我想说展开循环将是最明显的出路:
uint8_t i = 0;
for ( i = 0; i < 32; i++ )
{
printf("Instance of loop %d\n", (8*i)+0);
printf("Instance of loop %d\n", (8*i)+1);
printf("Instance of loop %d\n", (8*i)+2);
printf("Instance of loop %d\n", (8*i)+3);
printf("Instance of loop %d\n", (8*i)+4);
printf("Instance of loop %d\n", (8*i)+5);
printf("Instance of loop %d\n", (8*i)+6);
printf("Instance of loop %d\n", (8*i)+7);
}
理论上,这也应该更快,因为你有更少的测试和跳跃。如果需要,你也可以比这更严重地展开。
您可能也对Duff's device (SO question explaining it)感兴趣,这将允许您展开任何大小的循环,而不仅仅是一个有很好因素的循环。当然有限制,因为它要求你在内存中存储你需要的数量,在这种情况下超过8位字段,但是,为了循环,比如137次,它会有用。
请注意,您不需要执行8*i+1
阶段,这只是为了验证是否发生了足够的事件。
另一个注意事项:“但我不想写我的代码8次!”可以根据需要使用inline
函数(C99)或宏(C89)来克服。
答案 5 :(得分:1)
如果“byte”为char
,则在签名char(和8位)的系统上总是<255。如果您必须使用“字节”类型,请尝试unsigned char
,这应该适用于您的循环。
如果不仅仅是实验,请改用int
。
答案 6 :(得分:0)
编辑:我弄错了,它循环了255次...... :)一个do-while构造更好:
i = 0;
do {
// act
i++;
} while(i > 0);
以下两个片段循环255次,从1到255。
for(i = 1; i <= 255 && i != 0; i++)
应该去。或者也许
for(i = 1; i > 0; i++)
答案 7 :(得分:0)
通常最快将i
声明为int
。我无法想象你为什么要用8位整数循环。也许你认为它会比int
更快,但事实并非如此。