[英]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.