[英]Evaluation (NSIntegers) inside if-statement Objective-C
我对此感到怀疑,为什么它可以正常工作:
NSInteger row = indexPath.row;
NSInteger preloadTrigger = self.nodes.count - 20;
if (row >= preloadTrigger) {
[self.loader loadNextposts];
}
并且这不会(只是跳过if语句):
if (indexPath.row >= self.nodes.count - 20) {
[self.loader loadNextposts];
}
当self.nodes.count - 20
的值self.nodes.count - 20
为负时。
但是,当表达式的值为正数时,它总是可以正常工作。
一种非常奇怪的行为,因为我看不到两个表达式的语义差异。
更新:因此,我决定对其进行测试:
(lldb) po self.nodes.count - 20
18446744073709551601
(lldb) po preloadTrigger
-15
根据Apple Docs的说法,count属性是Objective-C中的NSUInteger
。
当你写:
NSInteger preloadTrigger = self.nodes.count - 20;
实际上,您正在将count
转换为NSInteger
对象,如果count
不大于20,则可NSInteger
负数。
但是当你写:
(indexPath.row >= self.nodes.count - 20)
count
是一个NSUInteger
对象,从中减去20将始终导致一个正数(顺便说一下,这是一个很大的数)。
因为nodes.count是NSUInteger,而行是NSInteger。 无符号整数-20永远不是负值,但是会在您期望它为负数的情况下产生巨大的正值。
我将在其他正确答案中添加一些解释。
所以,这是怎么回事:
self.nodes.count
的类型为NSUInteger,与64位系统中的unsigned long int
相同,或者在32位系统中与unsigned int
。
文字20
是int
类型。
当您形成表达式self.nodes.count - 20
, 20
被“提升”为另一个操作数( self.nodes.count
)的无符号整数类型,因为它的范围更广。
这是因为,当两个操作数具有不同大小的类型时,较小的一个将被提升为较大的一个以使其相等,并以这些条件计算结果(在硬件中,不同类型的值之间的算术运算并未真正定义-位表示形式有所不同)。
问题是,为了能够用相同的位长表示更大范围的正值,无符号整数不能表示负值。 因此,当20
大于self.nodes.count
,结果将“环绕”为一个大的无符号整数。
另一方面, indexPath.row
也是一个无符号整数( NSUInteger
),因此您最终将比较小的行值与减法运算的巨大结果进行了比较。 考试:
if (indexPath.row >= self.nodes.count - 20)
...总是失败(左侧较小)。
如果首先将两个结果都转换为有符号整数, 然后比较这些有符号整数:
NSInteger row = indexPath.row;
NSInteger preloadTrigger = self.nodes.count - 20;
if (row >= preloadTrigger) {
...然后没有发生换行/下溢,您将获得预期的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.