1 <-1评估为TRUE

n00*_*mer 0 objective-c ios

在我的部分代码中,我正在编写一个简单的for循环来迭代数组中的元素(所有NSMutableDictionarys),并且我发现循环执行即使条件基本上是1 <-1.

所以我编写了以下代码,以测试此问题的有效性:

NSMutableArray* arr = [[NSMutableArray alloc] init];

NSLog(@"COUNT: %d | %i", arr.count, 1 < (arr.count - 1));
Run Code Online (Sandbox Code Playgroud)

输出是:

COUNT: 0 | 1
Run Code Online (Sandbox Code Playgroud)

这实际上意味着计数为0,并且1小于-1.

我想也许是因为数组是刚刚初始化的,可能添加和删除一个对象可能会改变这一点,所以我继续这样做:

NSMutableArray* arr = [[NSMutableArray alloc] init];

[arr addObject:@1];
[arr removeObject:@1];

NSLog(@"COUNT: %d | %i", arr.count, 1 < (arr.count - 1));
Run Code Online (Sandbox Code Playgroud)

结果仍然相同:

COUNT: 0 | 1
Run Code Online (Sandbox Code Playgroud)

我想到的可能原因是:

  • 有一些关于编译器/目标-C的东西,我还不明白
  • 我的Mac中的注册很困扰
  • 我正在失去理智

我非常怀疑它是最后两个案例中的哪一个,我仍然想知道为什么会这样.

Kri*_*son 7

arr.count是无符号整数值(类型NSUInteger).使用无符号算术,(0 - 1)包围一个非常大的正数,而不是-1.

如果将值转换为有符号整数,您可能会看到预期的结果:

NSLog(@"COUNT: %d | %i", (int)arr.count, 1 < ((int)arr.count - 1));
Run Code Online (Sandbox Code Playgroud)

有关处理此常见错误源的一些方法,请参阅此主题:[NSArray count]中的常量错误未签名