9

Objective-C で 2 つの BOOL 値を比較したい。

以下のコードの(3)~(6)が動作することがわかりました。
(1)-(2) は BOOL が単にsigned char.

bool(3) 機能し、非常に読みやすいですが、objective-c ではないと思います。Objective-C コードでの
使用は良いですか?bool

Objective-C で 2 つの BOOL 値を比較する安全で良い方法はどれですか?
他に比較する良い方法はありますか?

BOOL b = YES;
BOOL c = 2;

NSLog(@"(1) %d", b == c); // not work
NSLog(@"(2) %d", (BOOL)b == (BOOL)c); // not work
NSLog(@"(3) %d", (bool)b == (bool)c);
NSLog(@"(4) %d", !b == !c);
NSLog(@"(5) %d", !!b == !!c);
NSLog(@"(6) %d", (b != 0) == (c != 0));

結果:

(1) 0
(2) 0
(3) 1
(4) 1
(5) 1
(6) 1
4

6 に答える 6

9

2 つのブール値の比較は、XOR 操作で処理する必要があります。

2 つのブール値を直接比較しようとすることは、ブール代数の基礎の誤用です: http://en.wikipedia.org/wiki/Boolean_algebra_(logic)

しているとき

BOOL a = (b == c);

その場合、b と c の両方が true であっても、この値は false を返す場合があります。ただし、式 b && c は、b と c の両方が真、つまり 0 より大きい場合は常に YES を返し、それ以外の場合は NO を返します。

代わりに、これはあなたが実際にやろうとしていることです:

BOOL xor = b && !c || !b && c;
BOOL equal = !xor;

と同等

BOOL equal = !(b && !c || !b && c);

また

BOOL equal = (b && c) || (!b && !c)

BOOL 値が正規化されている (つまり、1 または 0 に設定されている) ことを確認するために時間を費やす必要がある場合は、何か間違ったことをしています。

于 2012-06-21T10:05:30.997 に答える
5

boolC99 標準 (§7.16) の一部であるため、Objective-C での使用は完全に有効です。私の意見では、ブール型の安全な比較を処理するための最良の方法でもあります。

boolどこでも使用しない唯一の理由はBOOL、Objective-C とフレームワークに遍在することです。

于 2012-06-21T08:58:07.100 に答える
4

他の回答とは別に、ブール値を比較して等しいかどうかはあまり一般的な操作ではないことに注意してくださいBOOLは型ではなく、ブール値が整数のみであるという事実を隠す単なるマクロです。ブール演算ごとに、整数をブール値として正しく処理できるプログラミング構造と演算子を使用する必要があります。

例: if (condition1 == NO) {}あるべきif (!condition1) {}

if (condition1 == condition2) {}
以上のことができ
if ((condition1 && condition2) || (!condition1 && !condition2)) {}
ます
BOOL newCondition = (condition1 && condition2) || (!condition1 && !condition2); if (newCondition) {}

条件を記述する最短の方法が最良の方法である必要はありません。

于 2012-06-21T09:37:09.527 に答える
1

からobjc.h:

typedef signed char     BOOL; 
....

#define YES             (BOOL)1
#define NO              (BOOL)0

どうやら、 BOOL はsigned charであるため、 number 型の変数に割り当てることができるのは事実です。BOOLこれにより、比較が混乱します(比較は整数比較であるため)。

(4) 否定を使用して任意の整数値を 0 または 1 に変換する方法は、2 BOOL の論理値を安全に比較するための簡単な方法だと思います。

于 2012-06-21T08:42:22.067 に答える
1

BOOL「2」の意味を答えて、番号を有効な に変換します

あなたの文脈では、2 = YESです

Int number = 2;
BOOL c = (number == 2); //2 is YES

> 0 = はい

Int number = 2;
BOOL c = (number > 0); //2 is YES

それは、アプリケーションで何が TRUE で何が False であるかに大きく依存します

于 2012-06-21T08:38:02.120 に答える
-1

整数 2 を BOOL 型の変数に割り当てると、コードが壊れます。その後に何を得ても、それはあなたにふさわしいものです。

したがって、2 つの BOOL a と b を比較する唯一の賢明な方法は次のとおりです。

if (a == b) ...
if (a != b) ...
于 2014-03-19T22:46:13.113 に答える