我有看起来像这样的行为不端的代码:(执行此代码时,事件是一个带有一个元素的 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)
...但是,也许我对这里的一些理智感到高兴,这以同样的方式错误地工作。我一定遗漏了一些关于语法的基本知识,但我无法发现它。