我在编写大学项目时遇到了一些奇怪的问题。
我实现了一个堆栈结构,并尝试使用基本函数来操作它。
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在实例化新堆栈时返回非零值的原因。
我提出了严格平等的条件,而不是更大或更平等,现在它工作正常,但我需要理解我错误的深层原因,你能帮我解释一下为什么第一个版本没有用?
感谢。
编辑:这个问题与评论中链接的答案实际上并不重复。实际上我并没有想到我在比较有符号和无符号的值。
答案 0 :(得分:0)
这是因为您将无符号值与有符号值进行比较。在此期间,您的签名值将提升为无符号值,转换为unsigned时的-1比最大容量变量大得多。
混合类型时要小心。要解决此问题,您可以将max_capacity设置为有符号值,或者在进行比较之前将其显式地转换为signed int。
答案 1 :(得分:0)
比较int和unsigned int可能会让人感到困惑。
在这种情况下,为了进行比较,将(带符号)top_position值强制转换为无符号。 -1最终为0xFF..FF,并对比完成。
最佳实践:使用int或使用unsigned int,不要混用它们。