所以我在工作中遇到了一个大问题,因为我的代码中有这样的东西:
int foo = -1;
NSArray *bar = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
if (foo > [bar count]){
NSLog(@"Wow, that's messed up.");
} else {
NSLog(@"Rock on!");
}
你可能已经知道我发布这个,输出是:
“哇,真乱。”
据我所知, Objective-C 正在将我的负数转换为“有符号”整数,从而终止了我的比较。
我看到了关于此的其他帖子,他们都说明了问题所在,但没有人提出任何简单的解决方案来使这种比较真正起作用。此外,令我震惊的是没有编译器警告,因为这些警告给我带来了严重的问题。
最佳答案
问题
您遇到的问题是因为 foo
是一个有符号整数并且 -[NSArray count]
返回一个无符号整数,foo
正在进行到无符号整数的隐式类型转换。参见 Implicit Type Conversion想要查询更多的信息。此外,在 C here 中还有关于类型转换规则的更多信息。 .
解决方案
-[NSArray count]
返回一个无符号值,因为数组永远不会有负数的元素;最小的可能值为 0。将数组的计数与 -1 进行比较没有多大意义 - 计数将始终大于任何负数(尽管存在符号问题)。
因此,这里正确的解决方案,也是避免此类问题的方法,是使用与 -[NSArray count]
的返回值相匹配的类型,即 NSUInteger
(U 代表unsigned)。
关于objective-c - Objective-C : Unsigned int compare,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16161107/