-1

考虑:

BOOL ok = somethingOrOther() ;

ok = ok && somethingElse() ;

与:

BOOL ok = somethingOrOther() ;

ok &= somethingElse() ;

在这两种情况下,目的是somethingElse()评估if okis already NO。这是因为 C进行短路布尔评估

我希望我能写:

ok &&= somethingElse() ;

反而。但这似乎是非法的。

我的预感是&=会评估somethingElse(),而&&=(如果它是合法的)不会。

有谁知道?

4

5 回答 5

4

& 不是布尔评估,而是按位与运算(http://en.wikipedia.org/wiki/Bitwise_operation#AND),所以我希望a &= b总是评估b

于 2013-08-21T04:16:07.257 回答
2

短路不适用于按位运算符 - 标准没有定义这种行为。

但是,逻辑AND 和 OR 运算符会短路 - 从 C99 开始:

6.5.13.4 - 与按位二进制 & 运算符不同,&& 运算符保证从左到右的评估;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数

于 2013-08-21T20:02:31.977 回答
0

这似乎是一个糟糕的设计。如果你正在做错误检查,为什么不只是在返回时返回/保释/处理somethingOrOther错误false?然后你可以写

if(!somethingOrOther()) {
    /* handle error */
}

if(!somethingElse()) {
    /* handle error */
}
于 2013-08-21T04:13:15.787 回答
-1

有一个论点是,&按位操作ints 而不是布尔值,并且不知道要忽略其他(通常是 31 个)位中的哪一个。

还有另一个论点是okBOOL代码的意图显然是处理单个位,但随后BOOLtypedef'd 处理为char8 位......

所以 (Obj)C 真的需要一个&&=运算符来处理这种情况,以强制编译器将双方视为一个位......哦,我的......

我想这解决了这个问题,答案是:不。很遗憾 :-(

于 2013-08-21T05:40:22.437 回答
-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).

这似乎证实了这一点:

  • 如果以 0(否)开头,则xin的值ok &= x无关紧要ok
  • x无论如何都会被评估,即使它的值不能产生影响。
于 2013-08-21T14:55:24.410 回答