1. ホーム
  2. objective-c

[解決済み] objective-cのYES/NO,TRUE/FALSEと真偽の差はあるのか?

2022-04-26 14:56:12

質問

単純な疑問なのですが、これらの値に違いはあるのでしょうか(BOOLとboolの違いもあるのでしょうか)? 同僚は、Objective-Cではこれらは異なるものに評価されると言いましたが、それぞれの.hファイルのtypedefを見ると、YES/TRUE/trueはすべて次のように定義されていました。 1 と定義され、NO/FALSE/falseはすべて 0 . 本当に違いがあるのでしょうか?

どのように解決するのですか?

実用上の差はない 提供 を使用します。 BOOL 変数をブーリアンとして使用します。 C言語では、ブーリアン式が0と評価されるか0でないかを基準に処理されます。ですから

if(someVar ) { ... }
if(!someVar) { ... }

と同じ意味です。

if(someVar!=0) { ... }
if(someVar==0) { ... }

というわけで、どんなプリミティブな型や式でもブールテストとして評価することができます(ポインタなどを含む)。ただし、後者ではなく、前者を行う必要があることに注意してください。

なお、そこには に鈍重な値を割り当てた場合、その差は大きくなります。 BOOL 変数で特定の値をテストするため、常にブーリアンとして使用し、割り当てだけはその #define の値です。

重要なのは、文字比較でブーリアンをテストしてはいけないということです。 someVar YESではない0以外の値が割り当てられる可能性がありますが、それ以上に重要なのは、意図を正しく表現できないことだと私は考えています。

if(someVar==YES) { ... } // don't do this!
if(someVar==NO ) { ... } // don't do this either!

言い換えれば、構成要素を意図されたとおりに使用し、文書化されたとおりに使用すれば、C言語での苦痛から解放されるでしょう。