2012-12-26 102 views
4

我試圖在for循環中比較一個無符號數與有符號數,但它沒有執行for循環後的語句,這意味着for循環不工作,我認爲。我的代碼是:For循環 - 用帶符號整數比較無符號數

#include <stdio.h> 
int main() 
{ 
    unsigned int i; 
    for (i = 8; i >= -1; i--) 
    printf ("%d\n", i); 
    return 0; 
} 

在上面的代碼,是沒有得到執行printf語句,所以有什麼問題我for循環。我們不能比較一個無符號的數字和一個有符號的數字嗎?

回答

7
unsigned int i; 
for (i = 8 ; i >= -1; i--) 

-1被轉換爲無符號類型中用於比較的最大值。因此,對於unsigned值,

i >= -1 

僅供i = UINT_MAX如此。

爲了獲得預期的輸出,最簡單的方法是使用帶符號整數,例如, int

另一種方式是做一些魔術在閉環控制:

for(i = 8+1; i-- > 0;) 

但是,如果你這樣做,一定要寫評論解釋了不尋常的閉環控制代碼。

+0

i--> 0超越醜陋。 – gnasher729

+0

我應該寫'我 - > 0'嗎? ;) –

-1

如果將變量與尺寸進行比較,將變量聲明爲無符號通常是一個好主意,以避免此問題。

編譯器會提供有關比較簽名和未簽名類型的警告,因爲已簽名和未簽名的整數的範圍不同,並且當它們相互比較時,結果可能會令人驚訝。如果您必須進行這樣的比較,您應該明確地將其中一個值與其他值兼容,可能在檢查後確保您正在投射的值是有效的。

相關問題