-1

検討:

BOOL ok = somethingOrOther() ;

ok = ok && somethingElse() ;

対:

BOOL ok = somethingOrOther() ;

ok &= somethingElse() ;

どちらの場合も、 is alreadyの場合は評価さsomethingElse()ないように意図されています。これは、C が短絡ブール評価を行うためです。okNO

私は書くことができたらよかったのに:

ok &&= somethingElse() ;

代わりは。しかし、それは違法のようです。

私の予感は、(合法だった場合)&=評価されなかったであろう評価されるということです。somethingElse()&&=

誰でも知っていますか?

4

5 に答える 5

4

& はブール値の評価ではなく、ビットごとの AND 演算 ( http://en.wikipedia.org/wiki/Bitwise_operation#ANDa &= b ) であるため、常に評価すると予想されbます。

于 2013-08-21T04:16:07.257 に答える
2

ショートサーキットはビット単位の演算子には適用されません。標準ではそのような動作は定義されていません

ただし、論理AND および OR 演算子は短絡します - C99 から:

6.5.13.4 - ビットごとのバイナリ & 演算子とは異なり、&& 演算子は左から右への評価を保証します。最初のオペランドの評価の後にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません。

于 2013-08-21T20:02:31.977 に答える
0

これは悪い設計のようです。somethingOrOtherエラー チェックを行っている場合は、リターン時にリターン/保釈/エラーを処理しないのはなぜfalseですか? それからあなたは書くことができます

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

if(!somethingElse()) {
    /* handle error */
}
于 2013-08-21T04:13:15.787 に答える
-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).

これは次のことを検証しているようです:

  • xinの値は、最初から 0 (NO)のok &= x場合は無関係です。ok
  • xその値が違いを生まない場合でも、何があっても評価されます。
于 2013-08-21T14:55:24.410 に答える
-1

ビット単位であるとブール値ではなく s で&動作し、他の (通常は 31) ビットのどれを無視するかがわからないという議論があります。int

コードの意図は明らかに単一のビットを処理することであるというok別の議論がありますが、 8ビットのように処理されます...BOOLBOOLtypedefchar

したがって、(Obj)C では&&=、コンパイラに両側を 1 ビットと見なさせるために、このケースを処理する演算子が本当に必要になります ... ああ、私の ...

これで問題は解決したと思いますが、答えは NO です。不運にも :-(

于 2013-08-21T05:40:22.437 に答える