【问题标题】:Objective C integer comparison errorObjective C 整数比较错误
【发布时间】:2013-05-23 22:38:06
【问题描述】:

谁能向我解释 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 评估为 true。

【问题讨论】:

  • 可能是一些奇怪的二进制文件。
  • 出于某种原因,事物正在转换为无符号类型。在快速浏览文档时,我不明白为什么。我猜这是一个错误。我在这里得到了相同的结果,但它在 GDB 中运行良好;你能用那个代替吗?
  • 不只是在调试器中——我编译的代码也出现了同样的错误。
  • 您可以发布您的实际代码以及您拥有的任何日志结果吗?
  • 请出示您的代码!

标签: objective-c lldb comparison-operators


【解决方案1】:

已确认 - 这是 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)

【讨论】:

  • 没问题 - 编辑的答案也可以解释您的程序存在的问题。
  • 嘎。当然,C 只是 错误 允许有符号的 int 被默默地“提升”为无符号。我的意思是,很明显,该表达式仅测试为真,因为 C 决定更改我身上的一个数字。不过没关系。感谢您的回答!
  • 但是我不应该至少得到一个关于无效比较的警告吗? Ack,我看到 Apple 默认 GCC_WARN_SIGN_COMPARE 为 NO,天哪。而Analyze 也没有发现它。
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 2013-08-24
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多