C >;=使用变量名返回true,使用当前值返回false

C >;=使用变量名返回true,使用当前值返回false,c,C,在为大学项目编写代码时,我实际上遇到了一些奇怪的问题 我实现了一个堆栈结构,并尝试使用基本函数来操作它 typedef struct _stack { unsigned int max_capacity; int* array; int top_position; } stack; int isFull(stack* s){ return s->top_position >= (s->max_capacity - 1); } int isEm

在为大学项目编写代码时,我实际上遇到了一些奇怪的问题

我实现了一个堆栈结构,并尝试使用基本函数来操作它

typedef struct _stack {
    unsigned int max_capacity;
    int* array;
    int top_position;
} stack;

int isFull(stack* s){
    return s->top_position >= (s->max_capacity - 1);
}

int isEmpty(stack* s){
    return s->top_position == -1;
}

void push(stack* s, int elt){
    if (isFull(s)) return;
    s->array[++s->top_position] = elt;
}

int pop(stack* s){
    return s->array[s->top_position--];
}

int peek(stack* s){
    return s->array[s->top_position];
}

stack* createStack(unsigned int capacity){
    stack* s = malloc(sizeof(stack));
    s->max_capacity = capacity;
    s->array = malloc(sizeof(int) * capacity);
    s->top_position = -1;
    return s;
}
但当我尝试测试它时,我得到了akward结果:

stack* s = createStack(5);
if(isFull(s)) printf("Stack full.\n");
printf("Stack top position : %d, stack capacity : %d\n", s->top_position, s->max_capacity);
printf("-1 >= 4 : %d\n", -1 >= 4);
printf("top position >= (capacity - 1) : %d\n", s->top_position >= (s->max_capacity - 1));
返回

Stack full.
Stack top position : -1, stack capacity : 5
-1 >= 4 : 0
top position >= (capacity - 1) : 1
我不明白为什么我的函数isFull在实例化新堆栈时返回非零值

我把一个严格的平等条件,而不是更大或相等,现在它的工作很好,但我需要了解我的错误的深层原因,你能帮我解释一下为什么第一个版本不工作吗

谢谢


编辑:这个问题实际上不是评论中链接的答案的副本。实际上,我没有想到我在比较有符号值和无符号值。

这是因为你在比较无符号值和有符号值。在此期间,您的有符号值被提升为无符号值,并且-1在转换为无符号值时比max capacity变量大得多


在混合不同的类型时要小心。要解决这个问题,您可以将max_capacity设置为有符号值,或者在进行比较之前将其显式转换为有符号int

比较int和unsigned int可能会混淆

在这种情况下,为了进行比较,(有符号的)top_位置值被转换为无符号。-1以0xFF..FF结束,并与之进行比较


最佳实践:使用int或unsigned int,不要混用它们

哦,就像凯文在评论中说的。没想到这件蠢事。。非常感谢。“我会尽快接受你的回答。”瓦尔科莱说得很对,这里解释得更好。