在比较 array.size() 与负值时获得 if 条件的意外行为


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 时,两个值都是有符号的,并且比较符合您的预期。

最新更新