當下面的代碼運行時,它進入for循環並運行NSLog。爲什麼會發生?當str爲零時,([str length] - 2)爲什麼大於0?
NSString *aString = nil;
for (int i=0; i<([aString length]-2); i++) {
NSLog(@"Inside loop.");
}
隨着我的身影[aString length]-2
結果-2,這就是小於0?
當下面的代碼運行時,它進入for循環並運行NSLog。爲什麼會發生?當str爲零時,([str length] - 2)爲什麼大於0?
NSString *aString = nil;
for (int i=0; i<([aString length]-2); i++) {
NSLog(@"Inside loop.");
}
隨着我的身影[aString length]-2
結果-2,這就是小於0?
更確切地說,-[NSString length]
返回一個無符號整數,所以從零中減去兩個(請記住,調用nil
上的任何方法都爲零)不會給你-2,它會給你一個非常非常大的數字。將它投射到int
(或NSInteger
)以獲得您想要的結果。
你正在問for循環運行如果i<-2
;作爲[NSString length]
返回無符號整數,該值將換輪最大INT - 2
你傳遞一個消息給nil對象有太多:[aString length]
。我不確定這是否是已定義的行爲,並且可能會返回一個奇怪的值範圍,儘管我懷疑它可能足夠聰明以返回0.我的評論者說,這種懷疑是真實的。
如果'([aString length] - 2)'是-2(它不是)那麼'0 <-2'是假的,循環將不會運行。根據海報,它確實運行。 – 2011-10-26 16:07:36
在Objective-C中消息傳遞'nil'安全地返回零(並且總是有),除非返回類型是一個結構體,在這種情況下你可能會遇到問題。即使這在更現代的編譯器中也是如此。 –
事情是這樣int x = [aString length] -2; for(int i = 0; i
Olof