2010-08-13 57 views
2

我最近開始使用-Wall編譯器開關來嘗試提高我的代碼質量。這是給(正確的)警告這個小片段...簽名/無符號比較和-Wall

int i; 

    for (i = start - 1; i >= 0; i--) 
    { 
     if (i >= number1.array.size()) 
     { 
      one_value = 0; 
     } 

因爲number1.array.size是無符號的(這是對一個std :: vector的size方法)。由於循環中的測試是i> = 0,我必須簽名或不起作用。看來我有三種選擇;不要使用-Wall,忽略警告或引入輔助元素...

int   i; 
    unsigned int j; 

    for (i = start - 1; i >= 0; i--) 
    { 
     j = i; 

     if (j >= number1.array.size()) 
     { 
      one_value = 0; 
     } 

這些都不是特別理想。你能否提出其他建議,或者就我在這種情況下應該做什麼提出建議?

+0

你可以的static_cast <>其中一個其他的類型 – 2010-08-13 10:19:59

+1

你可以使用小已知的「down-to」運算符:'for(unsigned int i = start; i - > 0;)' – 2010-08-13 10:23:39

回答

3

「由於循環中的測試是i> = 0,我必須簽名或不起作用。」只要改變你的測試:

for(unsigned i = start; i--;) { 
    // ... 
} 

給你在循環體中我相同的值。

+0

你應該真的使用size_t來處理大小相關的變量。 * :: size()甚至返回該類型,爲什麼不使用它? – rubenvb 2010-08-16 10:49:49

+0

大體上同意。 有時雖然,size_t是printf()的婊子。 POSIX需要zengngt修飾符,它可以在Linux上運行。在Windoze或Solaris上不起作用,不確定有關BSD。所以通過不使用size_t可以避免在printf()時進行轉換。 – 2010-08-20 16:20:53

-1

這應該與您的代碼 -
istart奔跑1(而不是start-10),以及測試數組大小相應地改變。

unsigned int i; 

for (i = start; i > 0; i--) 
{ 
    if (i > number1.array.size()) 
    { 
     one_value = 0; 
    } 
+0

計數器'i'必須下降爲零以用於循環中的後續目的;對不起,我沒有說清楚。 – 2010-08-13 10:13:07

+0

那麼?無符號不會阻止數字達到0 – 2010-08-13 10:14:50

+0

@Brian:您可以在循環後面使用「(i-1)」而不是「i」。 – adamk 2010-08-13 10:19:44

2

使用'size_t'進行尺寸相關的比較。

size_t i = 0; 
0

你可以嘗試:

unsigned int i; 

for (i = start; i > 0;) 
{ 

    if (--i >= number1.array.size()) 
    { 
     one_value = 0; 
    } 

} 
1

首先,分配有符號數爲無符號類型可以有非常嚴重的後果(-1符號的32位類型是4 294 967 295在未簽名的情況下),這是該警告存在的原因之一。你可以在兩個解決方案中的一個地方或另一個地方進行轉換,無論你使用哪一個,只需將size()轉換爲有符號整數,就可以獲得相同的效果。沿着這些線路

東西將消除漏洞(不檢查正確性)

for(unsigned int i=0;i<start;i++) 
{ 
if(start-i>number1.array.size()) one_value=0; 
} 

我認爲:)