1

更新: これはすべてワイルド ガチョウ チェイスでした。提案された回答に基づいて変更を加えた後、機能しました。しかし、しばらくしてから試してみると、再び機能しませんでした。私が気付いたのは、デバッガーの使い方がすべてだったということです。areSameColor 内にブレークポイントがありました。コードをステップ実行しているときに、areUniqueColors が実行されていないと想定しました。しかし、私は 2 番目の状態をまたいでいて、短絡していると思いました。最終的に、以下の両方のオプションで正しく評価されました。2 番目の例の方が読みやすいと思われるため、この例に固執することにしました。みんなの時間をありがとう。

次のifステートメントがどのように評価されているか混乱しています...

    if(![self areSameColor:setCards] && ![self areUniqueColors:setCards]){
    match = NO;
}

私のテストケースでは [self areSameColor:setCards] は NO と評価されます。2番目の条件を評価することを期待しています。デバッガーを見ると、TRUE の結果にショートカットしているようです。

私もこれで試しました:

if(!([self areSameColor:setCards] || [self areUniqueColors:setCards])){
    match = NO;
}

どちらの場合も、2 番目の条件を評価していません。areSameColor と areUniqueColor は BOOL を返します。

私の予想評価は…

areSameColor | areUniqueColor | MATCH
NO | NO | match = NO
YES | NO | match UNCHANGED
NO | YES | match UNCHANGED

私はこれをどのように間違っていると考えていますか?

4

2 に答える 2

0

私の知る限り、標準では、最初のオペランドに適用された not 演算子が短絡評価をトリガーするかどうかを規定していません。&& と || を規定していますが、左から右に評価されます。単項演算子 (!) は通常、|| の前に右から左に評価されます。と &&。

少なくとも、答えは十分に灰色であり、全体の混乱を避けるために別の方法で再コーディングすることを保証します.

于 2013-04-08T05:09:22.290 に答える