2009-03-24 13 views
0

ブール論理に奇妙な問題があります。私は何か愚かなことをする必要がありますが、私はそれを理解することはできません。 次のコードでは、firstMeasure.isInvisibleAreaがtrueで、measureBuffer1がnilです。 何らかの理由でtest1がNOに評価されても、まだif文にドロップされています。 コメントアウトされた行を使用すると問題なく動作します。 これはなぜ起こりますか?ブール論理エラー

BOOL firstVisible = firstMeasure.isInVisibleArea; 
BOOL notFirstVisible = !(firstMeasure.isInVisibleArea); 
BOOL measureBufferNil = measureBuffer1 == nil; 

BOOL test1 = measureBuffer1 == nil && !firstMeasure.isInVisibleArea; 
BOOL test2 = measureBufferNil && !firstVisible; 

if (measureBuffer1 == nil && !firstMeasure.isInVisibleArea) 
//if (measureBufferNil && !firstVisible)  
{ 
    //do some action 
} 

更新1:!

私は完全にmeasureBufferビットで撮影したように私はfirstMeasure.isInVisibleAreaに問題を単離しました。 isInVisible領域は小さな計算ですが(何も変更されません)、計算はself.view.frameを使用しています。私は同様にこれを式から取り除き、何が起こるか見る。私の感想は、self.view.frameがisInVisibleAreaへの2回の呼び出しの間で変化していることです。


更新2: これは実際問題です。あなたが言うようにtest1のは、if文にtest1のをドロップし、NOに評価されている場合は、私は

+0

私は「そのコードはまったく同じ動作するはず」と言うとき、私は皆のために話すと思います。たぶんどこかの比較の中で等号を忘れていない限り。 Xcodeでシングルステップ実行しようとしましたか? –

+0

はい私は持っています。私にとっても意味がありません。 – Ian1971

+0

私はmeasureBuffer1ビットなしで試したので、firstMeasure.isInVisible領域に関連している必要があることを発見しました。私は質問 – Ian1971

答えて

0

私の勘違いが正しいことは、firstMeasure.isInVisible領域の呼び出し間でビューフレームが変化することに関連しています。

この全体のルーチンは、ビューの移動に応答して呼び出されます。メソッドの開始時にfirstMeasure.isInVisibleAreaの値を取得し、その値を使用する必要があると思います。

Phew。ブール論理は壊れていません。すべてが世界と正しかった。すべての入力のための

おかげで

2

以下でより詳細に答えを追加しました:

if(test1){ 
    //see if this executes? 
} 

をそれが何をするかを参照してください。

+0

を更新しました。これを行うと、if条件に正しく落ちません。 – Ian1971

5

疑問がある場合は、完全にかっこで囲む必要があります。優先順位のルールを調べることなく、何が起こっているかは、==より優先順位が高くなっているか、または& &です。だから、試してください:あなたは確かに括弧ができますが、あなたもnilオブジェクトがNOと非nilのオブジェクトをブールする評価YESブールし評価することを知っている必要があり

BOOL test1 = ((measureBuffer1 == nil) && !firstMeasure.isInVisibleArea); 
+0

==割り当てより高い優先順位を持っている= http://ja.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence –

4

。だから、同じように簡単にこれを書くことができます:

BOOL firstVisible = firstMeasure.isInVisibleArea; 
BOOL notFirstVisible = !(firstMeasure.isInVisibleArea); 
BOOL measureBufferNil = measureBuffer1; 

BOOL test1 = !measureBuffer1 && !firstMeasure.isInVisibleArea; 
BOOL test2 = measureBufferNil && !firstVisible; 

if (measureBuffer1 && !firstMeasure.isInVisibleArea) { 
    //do some action 
} 

あなたは同じ結果に終わるでしょう。私はGoatRiderと同意します。条件式をかっこして、実際に何をしたいのかを明確にすることは、言語の演算子の優先順位に依存するよりもずっと優れています。

+0

型の安全性に夢中になっている人は、それはただの幸運な事故であると主張します。 nil == NO && non-nil == YESで完全に可能です。しかし、私は狂っていません。 :-) – benzado

+0

私は方程式から完全にmeasureBufferを削除しました。問題はfirstMeasure.isInVisible領域にあります。最近の調査結果で質問を更新しました – Ian1971