迭代从N到0的所有值(包括无符号值)

时间:2011-12-09 04:26:01

标签: c size-t

我有这个代码适用于常规签名整数,我试图编写一个与size_t一起使用的等效版本(因为现在开始,count是整数,我需要它们是size_t):< / p>

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

我觉得这个代码很简单,只需要一个非常简单的解决方案,但我正在画一个空白。

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

size_t cnt, start;
for (start = cnt/2; start-- > 0; ) { ... }
  • 如果cnt = 0:start将从零开始,循环代码将永远不会执行;在循环之后,start将是(size_t)-1
  • 如果cnt = 1:相同
  • 如果cnt> = 2:循环代码将至少执行一次;在第一次迭代中,start将是(cnt / 2)-1;在最后一次迭代开始时将为0;循环开始后将是(size_t)-1

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

for (start = (cnt==1) ? 1 : cnt/2; start-- > 0; ) { ... }

答案 2 :(得分: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
}

答案 3 :(得分:0)

您可以从原始代码中修复结束条件。 C99中保证-1/2为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的初始值不可能是SIZE_MAX,因为没有size_t的值,除以2会产生SIZE_MAX

对于更一般的循环,可能需要从SIZE_MAX开始并一直向下包含0,显然我们不能在循环体之前执行退出检查,因为我们希望循环体执行一次对于size_t的每个值,所以没有值可以退出。为了允许这种情况:

size_t count = SIZE_MAX, start = SIZE_MAX;
do {
    someFunction(x, start, count);
} while (start-- != 0);

在所有情况下,SIZE_MAX都可以替换为-1,这更通用,因为它会转换为每个无符号类型的最大值,但会导致confused questions