使用MAX和数学计算数组

时间:2013-08-01 01:53:01

标签: objective-c nsarray max

我的代码行为错误如下:(当执行此代码时,事件是一个带有一个元素的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)

...但是,也许我对这里的一些理智感到高兴,这种做法也是错误的。我必须遗漏一些关于语法的基本知识,但我无法发现它。

2 个答案:

答案 0 :(得分:0)

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

但是你然后将这个无符号结果转换为签名它并将其解释为-1,让你认为结果不正确。

尝试:

p [[self events] count] - 2

你会看到很大的价值。

答案 1 :(得分:0)

这些BOOL,无论何时将比较运算符附加到它们(&lt;,&gt;,==等),它都会将该行更改为truefalse语句。例如,如果我输入:

 p (BOOL) 0

我得到NO,但是

p (BOOL) 0 < -1

我得到true

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