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 Inserted\n";
} else {
cout<<"Queue is overflow\n";
}
}我得到了这个输出:
Size of array:10
Queue is overflow这里显示的是size为10,而bck的值为-1,但它将转到else语句。
但是,如果我将if condition替换为if (bck < 10),则代码运行良好:
Size of array:10
Element Inserted有人能帮我识别这种行为吗?
发布于 2015-12-29 12:10:16
elems.size()很可能返回某种类型的无符号整数类型(类似于size_t),因此在比较中将有符号整数类型和无符号整数类型混合,这是未定义的行为iIrc --在本例中,编译器将-1提升为无符号,如果转换为-1,则会给出0xFFFFFFFF (2^32-1)。当你按字面写10的时候,这两个值都是有符号的,比较和你期望的一样。
https://stackoverflow.com/questions/34510690
复制相似问题