int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];
信不信由你,结果是0 !!! 试试谁能告诉我为什么???
答案 0 :(得分:3)
您将有符号数字(-1)与无符号数字(pointArray.count - 1)进行比较。
答案 1 :(得分:0)
请注意,以下代码重现了此问题:
#include <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
NSUInteger uns = 4;
int sig = -1;
BOOL cmp = (sig < uns);
NSLog(@"(%d<%zu)=%d", sig, uns, cmp);
}
这是
的输出 (-1<4)=0
正如已经指出的那样,问题在于您要将int
与NSUInteger
进行比较。但请记住,在64位系统上,NSUInteger
是typedef
of unsigned long
。
我们看到的行为是usual arithmetic conversion的结果:
- 如果任一操作数的类型为long double,则另一个操作数将转换为long double类型。
- 如果不满足上述条件且操作数的类型为double,则另一个操作数将转换为double类型。
- 如果不满足上述两个条件且操作数的类型为float,则另一个操作数将转换为float类型。
- 如果不满足上述三个条件(没有任何操作数是浮点类型),则对操作数执行整数转换,如下所示:
醇>
- 如果任一操作数的类型为unsigned long,则另一个操作数将转换为unsigned long类型。
- 如果不满足上述条件且操作数的类型为long而另一个操作数类型为unsigned int,则两个操作数都将转换为unsigned long类型。
- 如果不满足上述两个条件,并且任一操作数的类型为long,则另一个操作数将转换为long类型。
- 如果不满足上述三个条件,并且任一操作数的类型为unsigned int,则另一个操作数将转换为unsigned int类型。
- 如果不满足上述条件,则两个操作数都将转换为int。
由于两个操作数都不是浮点类型,我们到达4.
。由于第二个操作数(pointArray.count-1
)的类型为NSUInteger
,类型为unsigned long
,因此另一个操作数(counter
)将转换为类型unsigned long
,取值18446744073709551615
的值确实大于4
。