objective-c - 将 MAX 与 unsigned long 和 unsigned long 减法一起使用
问题描述
' NSArray
scount
是一个NSUInteger
. 当数组为空时,以下行设置-1
为p
(乍一看,有人会猜到p
会变成0
)。
NSInteger p = MAX(0, array.count - 1)
我假设,原因是宏将array.count - 1
其解释MAX
为 18446744073709551615 而不是-1,因此它将此值返回为大于二的值,但是因为p
是 a long
,所以它将大数转换为-1。我在这里错了吗?
那么,使用 MAX 比较整数是否安全?
例如,可以编写一个循环,在特定情况下,当 时a.count == 0
,直观上看起来像是立即退出,但实际上是在进行无数次迭代,冻结或崩溃设备。这是因为约束被解释为w < 18446744073709551615
?
NSMutableArray *a = [NSMutableArray arrayWithCapacity:10];
for(NSInteger w = 0; w < MAX(0, a.count-1); w++)
{
NSLog(@"w = %li",w);
}
我想,一个安全的方法是这样写:
NSInteger q = array.count - 1;
NSInteger p = MAX(0, q);
...这会将零设置为p
.
解决方案
使用MAX
即保存。使用不安全.count - 1
。
你的周期应该是:
for(NSInteger w = 0; 1 + w < a.count; ++w)
{
NSLog(@"w = %li",w);
}
推荐阅读
- python - 在 Pandas 中渲染样式时如何获取或分配表格 ID
- angular - 如何在 Angular 指令中将 ElementRef 转换为 HTMLFormElement
- svg - svg中可以消除哪个字符?为什么圆弧会渲染成完整的圆?
- bash - 使用 scp 将文件从本地文件夹复制到远程文件夹,脚本抛出“没有这样的文件或目录”
- python - 如何在函数内使用带变量的线程?PyQt5
- rust - 编译 rust-src 时的未知功能“llvm_asm”
- python - 带 Raspberry Pi 和 OctoPrint 的灯丝运动传感器
- ansible - 使用组参数时,Ansible 用户模块不是幂等的
- dart - 如何将时间转换为小时分钟
- jenkins - (已解决)在 `java.lang.Throwable: HttpInput idle timeout` 中保存配置结果