您可以从原始代码中修复结束条件。-1/2
在 C99 中保证为 0,这使得循环体执行一次,因此count == 1
如果类型未签名后仍然是必需的行为,您可能必须特别处理。
size_t count = something;
if (count > 1) {
for (size_t start = (count-2)/2; start != SIZE_MAX; --start) {
someFunction(x, start, count);
}
}
这是有效的,因为我们知道 的初始值start
不可能是,因为当除以 2 时SIZE_MAX
没有 的值yield 。size_t
SIZE_MAX
对于更一般的循环,可能需要从 0 开始SIZE_MAX
并一直下降到 0(含),显然我们不能在循环体之前执行退出检查,因为我们希望循环体对 的每个值执行一次size_t
,所以有没有我们可以退出的价值。为了允许这种情况:
size_t count = SIZE_MAX, start = SIZE_MAX;
do {
someFunction(x, start, count);
} while (start-- != 0);
在所有情况下,SIZE_MAX
都可以替换为-1
,它更通用,因为它转换为每个无符号类型的最大值,但会导致混淆问题。