2012-02-04 76 views
0

这是代码:如果>语句工作不正常,为什么这很简单?

int index = (gridPoint.y * self.iconsPerRow) + gridPoint.x; 
    NSLog(@"index 1: %i", index); 
    NSLog(@"count: %i", [self.icons count] - 1); 
    if (index > [self.icons count] - 1) { 
     index = [self.icons count] - 1; 
    } 
    if (index < 0) { 
     index = 0; 
    } 
    NSLog(@"index 2: %i", index); 

输出:

NSLog index 1: -4 
NSLog count: 3 
NSLog index 2: 3 

任何想法,为什么发生这种情况?它应该是0,如果它是一个负数。

回答

2

这是因为[self.icons count];返回NSUInteger(索引被转换为一个无符号整数,它将环绕到UINT_MAX-3)。将其更改为以下内容:

int index = (gridPoint.y * self.iconsPerRow) + gridPoint.x; 
NSLog(@"index 1: %i", index); 
NSLog(@"count: %i", [self.icons count] - 1); 
if (index < 0) { 
    index = 0; 
} else if (index + 1 > [self.icons count]) { // In case count is 0, we add to index rather than subtract from count 
    index = [self.icons count] - 1; 
} 
NSLog(@"index 2: %i", index); 
1

-[NSArray count]返回无符号整数。它可能会将-4转换为unsigned int,这是一个非常大的数字。这是超过三个大,所以这种说法是越来越触发,并将其设置为3,试试这个:

if (index >= self.icons.count) { 
    ... 
} 

这样就避免了演员,并且是干净了一点。

相关问题