template <class T>
class Queue {
private:
array<T, 10> elems;
int frt = -1, bck = -1;
};
当我运行以下代码片段时:
template <class T>
void Queue<T>::Enque(T const& item) {
cout << "Size of array:" << elems.size() << "n";
if (bck < elems.size()) {
if (bck == -1) frt = 0;
++bck;
elems.at(bck) = item;
cout << "Element Insertedn";
} else {
cout<<"Queue is overflown";
}
}
我得到这个输出:
Size of array:10
Queue is overflow
这里显示size
是 10,bck
的值是 -1,但它将转到 else 语句。
但是,如果我将if condition
替换为if (bck < 10)
则代码工作正常:
Size of array:10
Element Inserted
任何人都可以帮助我识别这种行为吗?
elems.size()
很可能返回某种无符号整数类型(类似于 size_t(,因此您在比较中混合了有符号和无符号整数类型,这是未定义的行为 iIrc - 在这种情况下,您的编译器将 -1 提升为 unsigned,如果按原样转换,将给出0xFFFFFFFF (2^32-1(。当您按字面意思编写 10 时,两个值都是有符号的,并且比较符合您的预期。