int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];
信不信由你,结果是0!!!试试看谁能告诉我为什么???
int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];
信不信由你,结果是0!!!试试看谁能告诉我为什么???
您正在将有符号数 (-1) 与无符号数 (pointArray.count - 1) 进行比较。
请注意,以下代码重现了此问题:
#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
正如已经指出的那样,问题在于您将 anint
与 an进行比较NSUInteger
。但请记住,在 64 位系统上,NSUInteger
是typedef
.unsigned long
我们看到的行为是通常算术转换的结果:
- 如果任一操作数是 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
。