Ошибка булевой логики - PullRequest
       15

Ошибка булевой логики

0 голосов
/ 24 марта 2009

У меня странная проблема с логической логикой. Я должен делать что-то глупое, но я не могу понять это. В приведенном ниже коде 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:

Я выделил проблему для! FirstMeasure.isInVisibleArea, так как я полностью взял бит measureBuffer. Внутри области isInVisible есть небольшой расчет (хотя он ничего не меняет), но он использует self.view.frame. Я собираюсь вычеркнуть это из уравнения и посмотреть, что произойдет. Я догадываюсь, что self.view.frame меняется между двумя вызовами isInVisibleArea.


Обновление 2: Это действительно проблема. Я добавил ответ более подробно ниже

Ответы [ 4 ]

5 голосов
/ 24 марта 2009

Если вы сомневаетесь, вы должны полностью заключить в скобки. Не обращая внимания на правила предшествования, я думаю, что то, что происходит, = получает более высокий приоритет, чем == или &&. Так что попробуйте:

BOOL test1 = ((measureBuffer1 == nil) && !firstMeasure.isInVisibleArea);
4 голосов
/ 24 марта 2009

Хотя вы, безусловно, можете заключить в скобки, вы также должны знать, что объекты nil оцениваются как логические NO, а объекты не отличные от нуля - как логические YES. Так что вы могли бы так же легко написать это:

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, хотя. Всегда лучше заключить в скобки ваши условные выражения, чтобы уточнить, чего вы действительно хотите, чем полагаться на приоритет оператора языка, чтобы сделать это для вас.

2 голосов
/ 24 марта 2009

Если test1 оценивается как NO, как вы говорите, поместите test1 в оператор if:

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

Посмотрите, что это делает.

0 голосов
/ 25 марта 2009

Моя догадка была верна, это связано с изменением рамки просмотра между вызовами в область firstMeasure.isInVisible.

Вся эта процедура вызывается в ответ на перемещение представления. Я думаю, что мне нужно захватить значение firstMeasure.isInVisibleArea в начале метода и использовать это значение повсюду.

Уф. Булева логика не нарушена. С миром все в порядке.

Спасибо за ваш вклад

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...