& =运算符在Objective-C中是否短路?

时间:2013-08-21 04:12:03

标签: objective-c

考虑:

BOOL ok = somethingOrOther() ;

ok = ok && somethingElse() ;

VS

BOOL ok = somethingOrOther() ;

ok &= somethingElse() ;

在这两种情况下,如果somethingElse()已经ok,则意图是NO 进行评估。这是因为C做short-circuit boolean evaluation

我希望我能写下来:

ok &&= somethingElse() ;

代替。但这似乎是非法的。

我的预感是&=会评估somethingElse(),而&&=(如果合法的话)则不会。{/ p>

有谁知道?

5 个答案:

答案 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个)位。

另一个论点是okBOOL代码的意图显然是处理一个位,但BOOLtypedef'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 &= xok的值无关紧要
  • x即使其价值无法发挥作用也会被评估。