1

次のような不正なコードがあります: (events は、このコードの実行時に 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

これらBOOLの s に比較演算子 (<、>、== など) を付けると、行がtrueorfalseステートメントに変わります。たとえば、次のように入力します。

 p (BOOL) 0

わかりますNOが、

p (BOOL) 0 < -1

私は得るtrue

さらに、最初のlldbブロックの下部にある奇妙なケース[[self events] count]は、実際には aNSUIntegerであるため、それから 2 を引く 184467440737095516151と、int にキャストしないと得られます。それがその奇妙な事件の理由でした。

于 2013-08-01T03:37:11.903 に答える