2011-12-31 64 views
1

如果我想使用像在for循環減少使用NSUInteger時,如何確定> = 0

for (NSUInteger row = 10; row >= 0; row--) { 
    // do something 
} 

一個循環我怎麼迴避的事實得到該行永遠是> 0,因爲它是一個無符號整數。 for循環的中間構造是否變成:

for (NSUInteger row = 10; row; row--) { 

} 
+1

爲什麼不使用NSInteger? – MByD 2011-12-31 00:56:53

+0

根據定義,這些指標不應該是負數,因此使用NSUInteger傳達語義意圖。 – 2016-02-02 06:02:17

回答

6

如果使用NSInteger的,而不是NSUInteger這變得簡單一點。由於NSInteger的是一個符號整型,要求零值的變量遞減運算符(--)的值變化爲-1,所以你可以使用一個簡單的對比測試此:

for (NSInteger row = 10; row >= 0; row--) { 
    // do stuff with row 
} 

如果你有因爲某些原因使用NSUInteger,那麼對值爲零的變量調用遞減運算符將導致變量的值環繞到NSUInteger的最大可能值。您可以使用NSUIntegerMax進行測試。

for (NSUInteger row = 10; row != NSUIntegerMax; row--) { 
    // do stuff with row 
} 
0

是否需要未簽名的?如果是這樣,你將不得不做出你想要的測試。可能排> = 0 & &排< = 10,儘管這對我的口味有點笨重。

編輯:只是想補充說,無符號> = 0的比較是多餘的,但如果你要堅持無符號,我會離開它,因爲它至少表達了意圖。

+0

「我會放棄它,因爲它至少表達了意圖。」它也會產生編譯器警告,所以應該刪除。 (如果你留下的代碼中散佈着會產生「可忽略的」編譯器警告的結構,那麼當你看到新的,可能更重要的警告時,你不太可能發現新的,可能更重要的警告。) – 2011-12-31 01:12:48

+0

好吧,如果我們真的在談論我會做什麼,我不會使用這個構造開始。如果我被迫在這裏使用unsigned,我仍然會明確指定範圍,而不是依賴非idomatic的構造,比如'NSUIntegerMax'。我不同意所有導致警告的代碼都需要更改 - 如果是這樣的話,它們也可能是錯誤。 – huskerchad 2011-12-31 04:13:00

0

您應該這樣做:

for (NSUInteger row = 10; row >= 1; row--) { 
} 

或本:

for (NSInteger row = 10; row >= 0; row--) { 
} 
0
for (NSUInteger index = 11; index > 0; index--) { 
    NSUInteger row = index-1; 
} 
0

如果你真的需要使用一個NSUInteger

for (NSUInteger row = 10; row >= 0; row--) { 
    // do something 
    if(row == 0) {break;} 
} 

否則,請嘗試使用NSInteger的西蒙·惠特克建議

0

另一個竅門是將遞減到條件檢查的一部分。順便說一下這個循環操作少一點經典操作。

for (NSUInteger i = 10; i-- > 0;) 
{ 
}