ing 发表于 2020-3-24 01:12

C 0 - 1 不等于负1

本帖最后由 ing 于 2020-3-27 15:43 编辑



刚开始 (最后一次循环) i:0 - 1 不等于-1(等于4....),清理缓存重启Clion;


但发现实现功能正常,运行却没有任何输出(可能是 i 的值导致);


当我把
```
size_t i = d; i >= 0; i--
```
改为
```
size_t i = d; i > -1; --i
```

再次调试后发现不会执行断点除的方法(直接停在 } 的位置)

我不知道这是为什么了,C 真是个神奇的东西

________________________________________________________________________________________
今天再次运行发现又可以了,但是 i 为 0 的时候执行 i-- 不等于 -1,导致没有退出循环和因为 i 值过大使程序异常


我换了个编译器,然而并没有解决我的问题....

注意 i 值的变化,减1没有变成-1,因此继续进入循环体



```
#include <stdio.h>
#include <stdlib.h>

#define MAX 15

typedef struct
{
    int r;
    int length;
}SqList;

void shellInsert(SqList *l, int dk)
{
    for (size_t i = dk + 1; i <= l->length; i++)
    {
      if (l->r < l->r)
      {
            int j = 0;
            l->r = l->r;
            for (j = i - dk; j > 0 && (l->r < l->r); j-=dk)
            {
                l->r = l->r;
            }
            l->r = l->r;
      }
    }
}

void shellSort(SqList *l,int d)
{
    //分割的常量
    int dk = 0;
    for (size_t i = d; i >= 0; i--)
    {
      dk = 2 * i + 1;
      shellInsert(l,dk);
    }
}

int main(int argc, char* argv[])
{
    SqList *l = (SqList*)malloc(sizeof(SqList));
    l->r = 49;
    l->r = 38;
    l->r = 64;
    l->r = 97;
    l->r = 76;
    l->r = 13;
    l->r = 27;
    l->r = 49;
    l->r = 55;
    l->r = 4;
    l->length = 10;

    //增量
    int d = 2;
    shellSort(l,d);

    for (size_t i = 1; i <= l->length; i++)
    {
      printf("%2d", l->r);
    }

    return 0;
}
```

TanXin 发表于 2020-3-26 01:11

size_t是标准C库中定义的,在64位系统中为long long unsigned int,非64位系统中为long unsigned int。

既然是 unsigned 无符号数,0-1当然不能得到-1啦~

建议尝试把 for (size_t i …… 改为 for (int i …… {:301_1001:}

yanghan19911 发表于 2020-3-24 03:09

shellInsert(l,dk);中,dk传入的值越来越大,dk的值控制shellInsert中的循环次数,递归造成函数陷入死循环,无法执行到你的输出函数
页: [1]
查看完整版本: C 0 - 1 不等于负1