1

我有这段代码适用于常规有符号整数,我正在尝试编写一个与 size_t 一起使用的等效版本(因为现在开始和计数是整数,我需要它们是 size_t):

int count,start;
for (start = (count-2)/2; start >=0; start--)
{
     someFunction( x, start, count); // x is to illustrate function has other parameters
}

我觉得这段代码对于一个非常简单的解决方案来说足够直截了当,但我正在画一个空白。

4

4 回答 4

3

你可以这样重写它:

start = count/2;
while (start > 0){
    start--;
    someFunction( x, start, count);
}

否则,我能想到的唯一其他选择是在有符号和无符号之间进行一些不符合标准的转换......或者用~(size_t)0......做一些事情

以下是一些不符合标准的替代方案:

for (start = (count-2)/2; (ssize_t)start >= 0; start--)
{
     someFunction( x, start, count);
}

for (start = (count-2)/2; start != ~(size_t)0; start--)
{
     someFunction( x, start, count);
}
于 2011-12-09T04:28:40.350 回答
1
size_t cnt, start;
for (start = cnt/2; start-- > 0; ) { ... }
  • 如果 cnt=0 : start 将从零开始,循环代码将永远不会执行;循环之后, start 将是 (size_t)-1
  • 如果 cnt=1 :相同
  • if cnt >=2 : 循环代码将至少执行一次;在第一次迭代中,start 将为 (cnt/2)-1;在最后一次迭代开始将是 0;循环开始后将是 (size_t)-1

编辑如果OP真的想为cnt = 1循环一次,则需要一个三元:

for (start = (cnt==1) ? 1 : cnt/2; start-- > 0; ) { ... }
于 2011-12-09T10:33:55.163 回答
0

只使用一个值减一怎么样?

size_t start_plus_one;
for (start_plus_one = (count-2)/2+1; start_plus_one >=1; start_plus_one--)
{
     someFunction( x, start_plus_one-1, count); // x is to illustrate function has other parameters
}
于 2011-12-09T05:35:50.500 回答
0

您可以从原始代码中修复结束条件。-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_tSIZE_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,它更通用,因为它转换为每个无符号类型的最大值,但会导致混淆问题

于 2011-12-09T10:19:34.573 回答