吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1404|回复: 2
收起左侧

[已解决] C 0 - 1 不等于负1

[复制链接]
ing 发表于 2020-3-24 01:12
本帖最后由 ing 于 2020-3-27 15:43 编辑



刚开始 (最后一次循环) i:0 - 1 不等于-1(等于4....),清理缓存重启Clion;
捕获.PNG
捕获2.PNG
但发现实现功能正常,运行却没有任何输出(可能是 i 的值导致);


当我把
size_t i = d; i >= 0; i--

改为
size_t i = d; i > -1; --i


再次调试后发现不会执行断点除的方法(直接停在 } 的位置
)
捕获.PNG
我不知道这是为什么了,C 真是个神奇的东西

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

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

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


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

#define MAX 15

typedef struct
{
    int r[MAX];
    int length;
}SqList;

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

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[1] = 49;
    l->r[2] = 38;
    l->r[3] = 64;
    l->r[4] = 97;
    l->r[5] = 76;
    l->r[6] = 13;
    l->r[7] = 27;
    l->r[8] = 49;
    l->r[9] = 55;
    l->r[10] = 4;
    l->length = 10;

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

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

    return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

TanXin 发表于 2020-3-26 01:11
size_t是标准C库中定义的,在64位系统中为long long unsigned int,非64位系统中为long unsigned int。

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

建议尝试把
[C] 纯文本查看 复制代码
for (size_t i ……
改为
[C] 纯文本查看 复制代码
for (int i ……

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ing + 1 + 1 我很赞同!

查看全部评分

yanghan19911 发表于 2020-3-24 03:09
shellInsert(l,dk);中,dk传入的值越来越大,dk的值控制shellInsert中的循环次数,递归造成函数陷入死循环,无法执行到你的输出函数
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-15 07:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表