在C中组合"while"和"for"循环,供用户选择永远循环或循环多次
combine "while" and "for" loop in C, for user to choose to loop forever or loop a number of times
我想结合 for 循环和 while 循环,用户可以选择循环直到它通过或循环多次,如果没有通过则return失败:
uint8_t SomeFunc(uint32_t LoopCnt, unit32_t LoopForever)
{
uint8_t result = FAIL;
if(LoopForever != FALSE)LoopCnt = -1; /*max out LoopCnt if LoopForever is set*/
do{
for(i = 0; i < LoopCnt; i++){
result = Func();
if (result == PASS) break;
}
}while(LoopForever & (result == FAIL))/* do while loopforever is set and the result is fail */
return result;
}
有没有更好的写法?具有更好的性能和更小的代码大小?它在 C 中。T他的解决方案可以不使用循环来实现基本上任何您可以想出的相同逻辑。
谢谢
假设 result
的备选方案只能具有 PASS
或 FAIL
的值。
当LoopCnt == UINT32_MAX
时,i <= LoopCnt;
永远为真。
代码使用 <=
测试而不是 <
。我们只需要测试 LoopCnt == 0
的情况然后递减 LoopCnt
.
uint8_t SomeFunc(uint32_t LoopCnt, unit32_t LoopForever) {
uint8_t result = FAIL;
if (LoopCnt > 0 || LoopForever != FALSE) {
LoopCnt--;
if (LoopForever != FALSE) {
LoopCnt = UINT32_MAX;
}
for (uint32t i = 0; i <= LoopCnt; i++){
result = Func();
if (result == PASS) {
return result; // Return now.
}
}
}
return result;
}
good answer is clarity, yet with 3 tests per iteration. This code has 2 iterations per loop. Only in select cases e.g. 3% of the time 的优点是测试越少越好。
你真的'need'将while
和for
结合起来吗?
uint8_t SomeFunc(uint32_t LoopCnt, uint32_t LoopForever) {
uint8_t result = FAIL;
while (result == FAIL && (LoopForever || LoopCnt--)) {
result = Func();
}
return result;
}
我想结合 for 循环和 while 循环,用户可以选择循环直到它通过或循环多次,如果没有通过则return失败:
uint8_t SomeFunc(uint32_t LoopCnt, unit32_t LoopForever)
{
uint8_t result = FAIL;
if(LoopForever != FALSE)LoopCnt = -1; /*max out LoopCnt if LoopForever is set*/
do{
for(i = 0; i < LoopCnt; i++){
result = Func();
if (result == PASS) break;
}
}while(LoopForever & (result == FAIL))/* do while loopforever is set and the result is fail */
return result;
}
有没有更好的写法?具有更好的性能和更小的代码大小?它在 C 中。T他的解决方案可以不使用循环来实现基本上任何您可以想出的相同逻辑。 谢谢
假设 result
的备选方案只能具有 PASS
或 FAIL
的值。
当LoopCnt == UINT32_MAX
时,i <= LoopCnt;
永远为真。
代码使用 <=
测试而不是 <
。我们只需要测试 LoopCnt == 0
的情况然后递减 LoopCnt
.
uint8_t SomeFunc(uint32_t LoopCnt, unit32_t LoopForever) {
uint8_t result = FAIL;
if (LoopCnt > 0 || LoopForever != FALSE) {
LoopCnt--;
if (LoopForever != FALSE) {
LoopCnt = UINT32_MAX;
}
for (uint32t i = 0; i <= LoopCnt; i++){
result = Func();
if (result == PASS) {
return result; // Return now.
}
}
}
return result;
}
你真的'need'将while
和for
结合起来吗?
uint8_t SomeFunc(uint32_t LoopCnt, uint32_t LoopForever) {
uint8_t result = FAIL;
while (result == FAIL && (LoopForever || LoopCnt--)) {
result = Func();
}
return result;
}