簡體   English   中英

C / C ++使用int或unsigned int

[英]C/C++ use of int or unsigned int

在很多代碼示例,源代碼,庫等中。我看到使用int,就我所知, unsigned int會更有意義。

我看到很多的地方是for循環。 見下面的例子:

for(int i = 0; i < length; i++)
{
    // Do Stuff
}

為什么你會使用int而不是unsigned int 這只是懶惰 - 人們不能打擾unsigned

使用unsigned可能會引入難以發現的編程錯誤,並且通常最好使用signed int來避免它們。 一個例子是當你決定向后迭代而不是向前迭代並寫下這個:

for (unsigned i = 5; i >= 0; i--) {
    printf("%d\n", i);
}

另一個是如果你在循環中做一些數學:

for (unsigned i = 0; i < 10; i++) {
    for (unsigned j = 0; j < 10; j++) {
        if (i - j >= 4) printf("%d %d\n", i, j);
    }
}

使用unsigned引入了這些類型的錯誤,並沒有任何好處。

這通常是懶惰或缺乏理解。

當值不應為負數時,我會使用unsigned int。 這也用於指定正確值應該是什么的文檔目的。

恕我直言,斷言使用“int”比使用“unsigned int”更安全是完全錯誤的並且是一種糟糕的編程習慣。

如果您使用過Ada或Pascal,您將習慣於使用更安全的方法來指定值的特定范圍(例如,一個只能是1,2,3,4,5的整數)。

我選擇在編程時盡可能明確。 也就是說,如果我打算使用其值始終為正的變量,則使用unsigned 許多人在這里提到“很難發現錯誤”但很少舉例。 請考慮以下使用unsigned主張示例,與此處的大多數帖子不同:

enum num_things {
    THINGA = 0,
    THINGB,
    THINGC,
    NUM_THINGS
};

int unsafe_function(int thing_ID){
    if(thing_ID >= NUM_THINGS)
        return -1;

    ...
}

int safe_function(unsigned int thing_ID){
    if(thing_ID >= NUM_THINGS)
        return -1;

    ...
}

int other_safe_function(int thing_ID){
    if((thing_ID >=0 ) && (thing_ID >= NUM_THINGS))
        return -1;

    ...
}

/* Error not caught */
unsafe_function(-1);

/* Error is caught */
safe_function((unsigned int)-1);

在上面的例子中,如果將負值作為thing_ID傳入會發生什么? 在第一種情況下,您會發現負值不大於或等於 NUM_THINGS ,因此該函數將繼續執行。

在第二種情況下,您實際上會在運行時捕獲它,因為thing_ID的thing_ID強制條件執行無符號比較

當然,您可以執行類似other_safe_function ,但這似乎更像是使用有符號整數而不是更明確並使用無符號開頭的other_safe_function

如果length也是int ,那么你應該使用相同的整數類型,否則在比較語句中混合有符號和無符號類型時會發生奇怪的事情。 大多數編譯器會給你一個警告。

你可以繼續問,為什么length要簽名? 嗯,這可能是歷史性的。

此外,如果您決定反轉循環,即

for(int i=length-1;i>=0 ;i--)
{
   // do stuff
}

如果使用無符號整數,則邏輯會中斷。

我認為最重要的原因是如果你選擇unsigned int ,你會得到一些邏輯錯誤。 實際上,您通常不需要unsigned int的范圍,使用int更安全。

這個微小的代碼是與用例相關的,如果你調用一些vector元素,那么原型就是int,但是有很多現代的方法可以用c ++來實現它。 對於(const auto&v:vec){}或迭代器,在某些計算中,如果沒有減去/達到負數,你可以並且應該使用unsigned(更好地解釋預期值的范圍),有時這里有很多貼出的例子顯示你實際上需要int但事實是所有關於用例和情況,沒有一個嚴格的規則適用於所有用例,並且強迫一個人愚蠢...

暫無
暫無

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

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