1

我有看起来像这样的行为不端的代码:(执行此代码时,事件是一个带有一个元素的 NSArray)

MAX(0, self.events.count-2)

我希望表达式的结果为 0,但它产生 -1。检查 NSObjCRuntime.h,MAX() 看起来像这样:

#define MAX(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __b : __a; })

使用 lldb,我看到以下内容:

(lldb) p (int)[[self events] count]
(int) $0 = 1
(lldb) p (int)[[self events] count] - 2
(int) $1 = -1
(lldb) p (BOOL)[[self events] count] - 2 < 0
(bool) $2 = true
(lldb) p (BOOL)0 > [[self events] count] - 2
(bool) $3 = false

嗯?也许是运算符优先级,但是...

(lldb) p (BOOL)(0 > [[self events] count] - 2)
(BOOL) $4 = NO
(lldb) p (BOOL)(0 > ([[self events] count] - 2))
(BOOL) $5 = NO

奇怪的是调试器在第一个有趣的答案后切换到大写 BOOL/YES/NO。有人可能会从前面假设这段代码的行为会有所不同:

MAX(0, self.events.count-2)

...但是,也许我对这里的一些理智感到高兴,这以同样的方式错误地工作。我一定遗漏了一些关于语法的基本知识,但我无法发现它。

4

2 回答 2

0

那些BOOLs,每当您将比较运算符附加到它们(<、>、== 等)时,它都会将该行更改为trueorfalse语句。例如,如果我输入:

 p (BOOL) 0

我明白了NO,但是

p (BOOL) 0 < -1

我明白了true

lldb此外,第一个块底部的那个奇怪的情况是因为[[self events] count]实际上是 a NSUInteger,所以当你从中减去 2 时, 184467440737095516151如果你不将它转换为 int,你就会得到。这就是那个奇怪的案例的原因。

于 2013-08-01T03:37:11.903 回答
0

问题是由于该count属性未签名。unsigned 1 - 2 的结果不是 -1,这是一个巨大的数字。因此返回巨大的数字,因为它大于 0。

但是您随后将此未签名的结果转换为已签名的结果,它会被解释为 -1,让您认为结果不正确。

尝试:

p [[self events] count] - 2

你会看到很大的价值。

于 2013-08-01T03:29:24.390 回答