iOS開發中NSUInteger帶來的坑
阿新 • • 發佈:2019-02-11
場景描述:
看下面程式碼的輸出結果是什麼?
NSInteger index = 0;
NSUInteger length = 0;
if (index > length - 1) {
NSLog(@"0大於-1");
}else {
NSLog(@"0不大於-1");
}
輸出結果是:0不大於-1
原因分析
首先,我們列印一下length - 1
的值,NSLog(@"length - 1 = %ld", length - 1);
,輸出結果為length - 1 = -1
,那麼為什麼結果是0不大於-1
,而不是0大於-1
呢?
我們換一種方式列印一下length - 1
NSLog(@"length - 1 = %lu", length - 1);
輸出結果為length - 1 = 18446744073709551615
,到這裡應該明白為什麼會這樣了,因為length
為NSUInteger
型別,所以length - 1
也是NSUInteger
型別。(注:NSInteger
為long
型別,NSUInteger
為unsigned long
型別)
解決辦法
方法一:強制型別轉換
NSInteger index = 0; NSUInteger length = 0; if (index > (NSInteger)length - 1) { NSLog(@"0大於-1"); }else { NSLog(@"0不大於-1"); }
輸出結果是:0大於-1
方法二:避免NSUInteger型別數做減法
NSInteger index = 0;
NSUInteger length = 0;
if (index + 1 > length) {
NSLog(@"0大於-1");
}else {
NSLog(@"0不大於-1");
}
輸出結果是:0大於-1