> =使用var名称返回true,但使用当前值返回false

时间:2018-05-30 15:36:11

标签: 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 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;
}

但是当我尝试测试它时,我得到了一些结果:

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在实例化新堆栈时返回非零值的原因。

我提出了严格平等的条件,而不是更大或更平等,现在它工作正常,但我需要理解我错误的深层原因,你能帮我解释一下为什么第一个版本没有用?

感谢。

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

2 个答案:

答案 0 :(得分:0)

这是因为您将无符号值与有符号值进行比较。在此期间,您的签名值将提升为无符号值,转换为unsigned时的-1比最大容量变量大得多。

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

答案 1 :(得分:0)

比较int和unsigned int可能会让人感到困惑。

在这种情况下,为了进行比较,将(带符号)top_position值强制转换为无符号。 -1最终为0xFF..FF,并对比完成。

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