Objective C整数比较错误

时间:2013-05-23 22:38:07

标签: objective-c lldb comparison-operators

有人能用Xcode / Objective C向我解释这些结果吗?当然,不存在-2应该测试大于31的情况。

(lldb) p dayOfMonth
(int) $37 = -2
(lldb) p (dayOfMonth > 31)
(bool) $38 = true
(lldb) p (dayOfMonth > (int)31)
(bool) $39 = true 
(lldb) p (dayOfMonth > (float)31) 
(bool) $40 = false

我从来没有见过像这样的直接错误答案,也无法想象它是如何被误解的。就像调试器所说的那样,dayOfMonth只是一个int。

编辑添加:这是失败的代码(切换了一些不相关的行):

    NSRange monthdays = [self.calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:self.displayedDate];
    int dayOfMonth = i+1-shift;  // negative days are at end of prev month; days higher than length of month are in next
    if (dayOfMonth < 1) cellView.dayLabel = prevMonthDays.length + dayOfMonth;
    if (dayOfMonth > monthdays.length) cellView.dayLabel = dayOfMonth - monthdays.length;

当dayOfMonth为负数时,第二个if的计算结果为真。

1 个答案:

答案 0 :(得分:2)

确认 - 这是lldb IR解释器中的一个错误。

以下是修补程序修补程序的链接:http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20130520/008569.html

请注意,新的测试用例正是您的问题:

+        self.expect("expression (int)-2",
+            startstr = "(int) $4 = -2")
+
+        self.expect("expression $4 > (int)31",
+            startstr = "(bool) $5 = false")

所以,以后应该让事情为你服务!

就你的代码而言,你确实有一个错误。这个条件:

if (dayOfMonth > monthdays.length)

没有做你想要的。 dayOfMonth已签名,monthdays.length未签名。这意味着dayOfMonth被提升为无符号类型,并且比较变坏。你需要一个演员来清理:

if (dayOfMonth > (NSInteger)monthdays.length)