【问题标题】:NSUInteger in reversed loop confusion?NSUInteger 在反向循环混乱中?
【发布时间】:2014-05-25 18:40:13
【问题描述】:

我想知道是否有人可以解释一下,我设置了一个循环,我想从 10 倒数到 0:

for(NSUInteger index = 10; index >= 0; index--) {
    NSLog(@"INDEX: %ld", (long)index);
}

这个循环永远运行,它不会在 0 处停止,而是不断地进入负数。当我注意到这一点时,我将代码更改为:

for(NSInteger index = 10; index >= 0; index--) {
    NSLog(@"INDEX: %ld", (long)index);
}

上面的工作正常,但我很好奇,为什么第一个例子不起作用,因为生成的数字都是无符号整数?

【问题讨论】:

  • 顺便说一句 - 将第一个 NSLog 更改为 NSLog(@"INDEX: %u", index);,您会更好地看到问题。

标签: objective-c nsinteger nsuinteger


【解决方案1】:

无符号类型不能“继续输入负数”。在index = 0时的迭代后,index--变为0xFFFFFFFF,仍然大于零。容易犯的错误,我自己做过。

静态分析器实际上会就此向您发出警告(“条件索引 >= 0 始终为真”等。)我强烈建议将其设置为在调试构建时自动运行。

【讨论】:

  • 啊,我明白了,所以因为它的“无符号”它总是 >= 0(无符号),即使记录的值为“-10”。我现在明白了,非常感谢您花时间解释,非常感谢。静态分析器已打开,但我没有看到警告,我现在看到了。
  • 是的,NSLog 行将无符号转换回有符号,因此它恢复了它的消极性。使用 NSLog(@"INDEX: %@", @(index));更可靠一点,因为它避开了 sprintf 的投射限制。
【解决方案2】:

请注意,NSUInteger 始终 >= 0,因此,您的循环条件将始终为真。

【讨论】:

    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 2023-01-25
    • 2015-02-10
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多