踩坑場景
今天在使用NSUInteger
的時候,遇到了一個坑,代碼如下:
for (NSUInteger i = array.count - 1; i >= 0; i--)
{
// do something
}
運(yùn)行以上代碼后,for
循環(huán)會無限循環(huán)。
原因
一臉懵逼的我打印調(diào)試了小半天后,發(fā)現(xiàn)當(dāng)變量i
等于0
時,再次執(zhí)行i--
操作后,變量i
并不等于-1
,而是等于18446744073709551615
。這是因為變量i
是無符號整型,將-1
賦值給變量i
時,-1
會被強(qiáng)制轉(zhuǎn)換為一個很大的正整數(shù)。所以變量i
的值會始終大于等于0
,從而導(dǎo)致無限循環(huán)。
另一個關(guān)于NSUInteger的坑
偽代碼如下:
NSUInteger count = 0;
NSInteger a = -10;
if( a < count )
{
// do something
}
運(yùn)行以上代碼后,if
判斷結(jié)果為NO
,不會執(zhí)行括號里面的操作。
這是因為在比較一個有符號整型變量與一個無符號整型變量的大小時,有符號整型變量會被強(qiáng)制轉(zhuǎn)換為無符號整型變量,所以-10
會被轉(zhuǎn)換為一個很大的正整數(shù),導(dǎo)致if
判斷結(jié)果為NO
。