布尔逻辑失败

时间:2009-03-24 19:50:04

标签: iphone objective-c

我遇到布尔逻辑的奇怪问题。我必须做一些愚蠢的事,但我无法弄清楚。 在下面的代码中,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 个答案:

答案 0 :(得分:5)

如果有疑问,您应该完全括号。在没有查找优先规则的情况下,我认为正在发生的事情是=正在获得比==或&&更高的优先级。所以试试:

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

答案 1 :(得分:4)

虽然您当然可以使用括号,但您还应该知道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 :(得分:2)

如果test1正在评估为NO,那么将test1放入if语句:

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

看看它的作用。

答案 3 :(得分:0)

我的预感是正确的,它与调用firstMeasure.isInVisible区域之间的视图框架有关。

响应视图移动调用整个例程。我想我需要在方法的开头抓取firstMeasure.isInVisibleArea的值,并在整个过程中使用该值。

呼。布尔逻辑没有被破坏。一切都是对的。

感谢您的所有输入