2012-04-13 21 views
0

此代碼,當使用Visual Studio 2010讓Visual Studio中警告無符號比較

#include <cstdlib> 
#include <cstdio> 

int numbers[] = { 23, 24, 25, 25, 28, 20, 20 }; 

int main(void) { 
    int d = -1, x=0; 
    size_t count = sizeof(numbers)/sizeof(numbers[0]); 

    if (d <= (sizeof(numbers)/sizeof(numbers[0]))-2) 
     x = numbers[d+1]; 

    if (d <= count-2) 
     x = numbers[d+1]; 
} 

編譯給了我一個符號/無符號不匹配上if (d <= count-2)但不能在if (d <= (sizeof(numbers)/sizeof(numbers[0]))-2)警告。爲什麼是這樣?我已啓用全部警告。

回答

1

這是一個錯誤,在這種情況下,Visual C++編譯器不會發出警告C4018。請參閱Microsoft Connect錯誤報告,"warning C4018 (signed/unsigned mismatch) for sizeof operator."

此問題似乎只與使用sizeof間接相關。在其他情況下,編譯器也無法發出警告,在比較中涉及常量值的無符號類型。例如,如果將const資格添加到count,即使進行第二次比較,也不會發出C4018。

0

我的猜測是,它把2爲int所以促進 (sizeof(numbers)/sizeof(numbers[0]))-2)爲int,因爲支架等等comaprison是讓你獲得一個簽名簽名衝突int < int

+0

去除-2也沒有標誌斷聲明具有符號不匹配 – Abhijit 2012-04-13 21:44:01

+0

這將是倒退。當操作數具有混合的符號性和無符號的類型具有比所述簽名類型相等或更高的秩和這兩種類型的具有比相等或更高秩'int',已簽名的操作數轉換爲無符號的類型。因此,在這裏,操作數的類型爲int和size_t,int操作數(d)被轉換爲size_t(產生一個非常大的正數),並且對這兩個操作數進行比較'size_t'值。 – 2012-04-13 23:15:35

0

size_t被定義爲無符號。

請注意,由於sizeof在編譯期間進行了評估,並且正在被一個常量值替換,所以它不會抱怨符號不匹配,但是在另一個表達式中,您顯式將該值轉換爲可能可能的size_t變量當您嘗試與簽名號碼進行比較時發生溢出。

+2

'sizeof'表達式也是'size_t'類型。 – 2012-04-13 21:39:09

+0

@JamesMcNellis:sizeof返回一個編譯時間常量,所以比較恰好與不帶有無符號變量的常量進行比較。 – Abhijit 2012-04-13 21:47:25

+0

該值仍然是'size_t'類型。在編譯時或運行時評估表達式不會影響表達式中涉及的類型。程序中沒有任何內容不能在編譯時計算。 – 2012-04-13 21:49:22