2
int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];

信不信由你,结果是0!!!试试看谁能告诉我为什么???

4

2 回答 2

3

您正在将有符号数 (-1) 与无符号数 (pointArray.count - 1) 进行比较。

于 2013-01-17T03:44:50.397 回答
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

正如已经指出的那样,问题在于您将 anint与 an进行比较NSUInteger。但请记住,在 64 位系统上,NSUIntegertypedef.unsigned long

我们看到的行为是通常算术转换的结果:

  1. 如果任一操作数是 long double 类型,则另一个操作数将转换为 long double 类型。
  2. 如果不满足上述条件且任一操作数为 double 类型,则将另一个操作数转换为 double 类型。
  3. 如果不满足上述两个条件,并且其中一个操作数是 float 类型,则将另一个操作数转换为 float 类型。
  4. 如果不满足以上三个条件(操作数都不是浮点类型),则对操作数进行整数转换,如下所示:
    • 如果任一操作数是 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

于 2013-01-17T04:01:20.590 回答