我遇到布尔逻辑的奇怪问题。我必须做一些愚蠢的事,但我无法弄清楚。 在下面的代码中,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: 这确实是个问题。我在下面更详细地添加了答案
答案 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的值,并在整个过程中使用该值。
呼。布尔逻辑没有被破坏。一切都是对的。
感谢您的所有输入