簡體   English   中英

C++ - 負數和正數之間的比較返回 false

[英]C++ - Comparison between negative and positive number returns false

我在 C++ 中使用 Vector 實現隊列

我使用sz變量來跟蹤在任何插入/刪除操作中隊列中有多少空閑元素。

我在比較的實現中遇到了一個問題:

sz < vec.size() - 1

在某些時候,這條線開始返回0並且比較是

-1 < 5

有幫助的一件事是這樣做

int vecsz = vec.size() - 1;
int regsz = sz;

if (regsz < vecsz)
{
    sz++;
}

盡管它有所幫助,但我仍然不明白為什么。 有人可以對此有所了解嗎?

隊列.h

#include <iostream>
#include <vector>

using namespace std;

template <typename Object>
class queue
{
public:
    queue(int s) 
      : vec(s) 
    {
        sz = s - 1;
    }
    queue () { }
    ~queue() { }

    /**
     * Add element to Q and decrease size 
     */
    void enque(Object obj)
    {
        if (sz >= 0) {
            vec[sz] = obj;
            sz--;
        }
    }

    /**
     * Remove element from Q and increase size 
     */
    Object deque()
    {
        // grab last element
        int last = vec[vec.size() - 1];

        // remove last element from array
        vec.pop_back();

        // insert 0 in the front
        vec.insert(vec.begin(), 0);

        int vecsz = vec.size() - 1;
        int regsz = sz;

        // increase size tracking var
        if (regsz < vecsz)
        {
            sz++;
        }

        return last;
    }

    void print() {
        for (int i = 0; i < vec.size(); ++i) {
            cout << "i: " << vec[i] << endl;
        }
    }

private:
    vector<int> vec;
    int sz;
};

主要的

int main()
{
    queue<int> Q(5);
    cout << "Empty Q:" << endl; 

    Q.print(); 
    cout << endl;

    Q.enque(1);
    Q.enque(2);
    Q.enque(3);

    cout << "Full Q1:" << endl; 

    Q.print(); 

    cout << "Deque " << endl;
    cout << Q.deque() << " " << Q.deque() << " " << Q.deque() << " " << endl;
    cout << Q.deque() << endl;

    cout << "Print " << endl;
    Q.print(); 

    cout << "Enqueue " << endl;
    Q.enque(10);
    Q.enque(20);
    Q.enque(30);
    Q.enque(40);
    Q.enque(50);

    cout << "\nFull Q2:" << endl; 
    Q.print(); 

    cout << endl;
    cout << Q.deque() << endl;

    Q.enque(100);

    cout << "Full Q3:"; Q.print(); cout << endl;

    cout << Q.deque() << endl;
    cout << Q.deque() << endl;
    cout << Q.deque() << endl;
    cout << Q.deque() << endl;

    return 0;
}

這就是為什么不要混合有符號和無符號類型很重要的原因。

sz < vec.size() - 1

您正在將已簽名的 integer 與未簽名的 integer 進行比較。 當您這樣做時,編譯器會將帶符號的 integer 轉換為與無符號 integer 相同的類型。 當你這樣做並且有符號的 integer 恰好是負數時,你會得到一個值,它是無符號類型的最大值,減去有符號的 integer 的值所以

-1 < 5

變成

4294967295 (for 32 bits) or 18446744073709551615 (for 64 bits) < 5

這是錯誤的。

要解決此問題, sz無符號類型。

vec.size()是一個無符號 integer。 當您將無符號 integer 類型與相同大小或更小的有符號 integer 類型進行比較時,有符號類型將轉換為與另一個相同的類型。 無符號類型不能表示負數。

通常,由於您觀察到的問題,您應該避免將有符號數與無符號數進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM