1

Objective-C の BOOL は unsigned char の typedef であり、YES & NO キーワードはエンコードされた文字であると言われました。聞いたのはこれが初めてではありません。これは、C 標準が _Bool 型を提供する前に Apple が BOOL を使用したためだと読みましたが、間違っていますか? その事実の利点はありますか?メモリのビットを無駄にしていますか? これは、関数で貴重なデータを返す方法を提供しますか? 予期しない動作が発生したときに別の値を返す方法として使用するのは正しいでしょうか?

BOOL myFunction(int argument)
{
    BOOL result = YES; //The function generates the result
    if (someError == YES) {
        return 5;
    }
    return result;
}
4

3 に答える 3

5

メモリのビットを無駄にしていますか?

いいえ、 a より小さい変数を取得できないため、char常に 1 バイトです。ブール フラグを表す複数のビットを 1 つの単語にパックできますが、手動で行う必要があります (ビット シフトやビット フィールドの使用など)。

これは、関数で貴重なデータを返す方法を提供しますか?

そうではありません:あなたがしたことはハックですが5、システムを介して呼び出し元に到達することは間違いなくYES、「プレーンな」ifステートメントのように解釈されます。

if (myFunction(123)) {
    ...
}

ただし、次のように使用すると、惨めに失敗します。

if (myFunction(123) == YES) { // 5 != YES
    ...
}

予期しない動作が発生したときに別の値を返す方法として使用するのは正しいでしょうか?

読みやすさの観点からは、常に正しくありません。「意図したことを実行する」限り、関数の使用方法によって、マイレージは異なる場合があります。

于 2013-01-14T22:01:11.837 に答える
1

わずかな利点があります。多くのプラットフォーム (iOS、IIRC を含む) ではsizeof(_Bool) == sizeof(int)、 を使用charすると、わずかにコンパクトになります。

ただし、 BOOLis really signed char、 not char、 this is so は@encode(BOOL)、すべてのプラットフォームで同じものとして評価されます。BOOL foo:1;1 ビットの符号付き整数 (IIRC の動作は定義されていません) を定義しているように見えるため、これはビットフィールドを少し複雑にします — 明らかunsigned charにより良い選択ですが、おそらく遅すぎました。

_Boolまた、コンパイラは使用されるビットパターンについて仮定を行うことができるため、より適切に最適化する必要がありますa&&b(a&b副作用bがない場合)。一部のアーキテクチャは、すべてのビット セットとして「真」を表し、マスキングに役立ちます (SSE 比較命令が思い浮かびます)。

于 2013-01-14T22:16:43.987 に答える
0

「Objective-C の BOOL」は unsigned char ではなく、Objective-C ライブラリで定義されているものです。コンパイラの設定 (32 ビットまたは 64 ビット) に応じて、どちらが unsigned char または bool になります。どちらも異なる動作をします。32 ビット コンパイラと 64 ビット コンパイラでこのコードを試してください。

BOOL b = 256;
if (b) NSLog (@"b is true"); else NSLog (@"b is false");
于 2016-12-20T09:31:35.300 に答える