考虑:
BOOL ok = somethingOrOther() ;
ok = ok && somethingElse() ;
VS
BOOL ok = somethingOrOther() ;
ok &= somethingElse() ;
在这两种情况下,如果somethingElse()
已经ok
,则意图是NO
不进行评估。这是因为C做short-circuit boolean evaluation
我希望我能写下来:
ok &&= somethingElse() ;
代替。但这似乎是非法的。
我的预感是&=
会评估somethingElse()
,而&&=
(如果合法的话)则不会。{/ p>
有谁知道?
答案 0 :(得分:4)
&安培;不是布尔评估,而是按位AND操作(http://en.wikipedia.org/wiki/Bitwise_operation#AND),因此我希望a &= b
始终评估b
。
答案 1 :(得分:2)
短路不适用于按位运算符 - 标准没有定义此类行为。
逻辑 AND和OR运算符会产生短路 - 来自C99:
6.5.13.4 - 与按位二进制和&操作员,&&运营商保证从左到右的评估;在评估第一个操作数后有一个序列点。如果第一个操作数比较等于0,则不计算第二个操作数
答案 2 :(得分:0)
这似乎是一个糟糕的设计。如果您正在进行错误检查,为什么不在somethingOrOther
返回false
时返回/保释/处理错误?然后你可以写
if(!somethingOrOther()) {
/* handle error */
}
if(!somethingElse()) {
/* handle error */
}
答案 3 :(得分:-1)
有一个论点要求&
按位操作int
不在布尔值上,并且不知道要忽略哪一个(通常是31个)位。
另一个论点是ok
是BOOL
代码的意图显然是处理一个位,但BOOL
为typedef
'd为char
有8位......
所以(Obj)C真的需要一个&&=
运算符来处理这种情况,以便强制编译器将双方都视为一个单位......哦,我...
我想这解决了问题,答案是:不。不幸的是: - (
答案 4 :(得分:-1)
我进行了以下测试:
- (void)testExampleOther {
__block BOOL called = NO ;
NSInteger (^eval)(NSInteger) = ^NSInteger (NSInteger x) {
called = YES ;
return x ;
} ;
BOOL failed = NO ;
BOOL ok = NO ;
for (NSInteger i = 0 ; i < 256 ; ++i) {
ok &= eval(i) ;
if (ok) {
failed = YES ;
NSLog(@"bitwise & used as logic wise && failed for value: %d", i) ;
}
}
if (!failed) {
NSLog(@"All values 'x' from 0 to 255 returned NO for:\" BOOL ok = NO ; ok &= x ; \"") ;
}
if (called) {
NSLog(@"BUT x was evaluated even though it did not need to.") ;
}
}
这是相关的输出:
Test Case '-[JFBLib_Tests testExampleOther]' started.
2013-08-21 15:50:47.127 xctest[23845:303] All values 'x' from 0 to 255 returned NO for:" BOOL ok = NO ; ok &= x ; "
2013-08-21 15:50:47.127 xctest[23845:303] BUT x was evaluated even though it did not need to.
Test Case '-[JFBLib_Tests testExampleOther]' passed (0.000 seconds).
这似乎验证了:
x
为0(否),则ok &= x
中ok
的值无关紧要x
即使其价值无法发挥作用也会被评估。