我对布尔逻辑有一个奇怪的问题.我必须做一些愚蠢的事,但我无法弄清楚.在下面的代码中,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:这确实是问题所在.我在下面更详细地添加了答案
如有疑问,您应该完全括号.在没有查找优先级规则的情况下,我认为正在发生的事情是=正在获得比==或&&更高的优先级.所以尝试:
BOOL test1 = ((measureBuffer1 == nil) && !firstMeasure.isInVisibleArea);