6

我有一个我无法理解的问题

NSArray *emptyArr = @[];
for (int i=0; i < ([emptyArr count]-1) ; i++) {
    NSLog(@"Did run for1");
}

[emptyArr count]- 1 是 -1 但我的应用程序仍然运行NSLog命令!

如果我使用 int 变量:

NSArray *emptyArr = @[];
int count = [emptyArr count]-1;
for (int i=0; i < count ; i++) {
    NSLog(@"Did run for1");
}

然后我的应用程序不运行NSLog命令。

请任何人帮助我!

4

3 回答 3

6

这是因为返回类型countunsigned int。当你从 0 中减去 1 时,你不会得到 -1。相反,您下溢到可能的最高值unsigned int。它在第二个版本中起作用的原因是因为您将它(隐式)转换为int值 -1 是合法的。

于 2013-06-11T08:24:35.550 回答
0

[emptyArr count]-1永远不会小于 0,因为它是无符号的。我猜如果你这样做((int)[emptyArr count]-1),你会得到正确的行为。

于 2013-06-11T08:25:46.477 回答
0

[emptyArr count] 返回的值是无符号整数。在第一种情况下,[emptyArr count]-1 是 2 的补码表示的 0-1,这是一个巨大的数字。所以它会多次打印日志。

在第二种情况下,[emptyArr count]-1 -> 您将 this 的结果转换为 int。0-1 -> -1 有符号整数。因此不打印。

于 2013-06-11T08:28:50.670 回答