2

myObjectと呼ばれるオブジェクトへのポインタがあり、それが本当に何かを指しているかどうかを知る必要があるとしましょう。このコードはどのようにできますか?

// assume MyObjectClass *myObject;
return (BOOL)myObject;

112を返しますか?私はいつでも書くことができることを知っています

return (myObject == nil);

そして、すべてがうまくいくでしょう。しかし、今日まで、boolに何かを明示的にキャストすると、常にorが返されるtruefalse(私が知る限り、0は常にと見なされ、falseその他の値はと見なされますtrue)、BOOLとそのYESNOは単に「名前が変更された」boolであると常に想定していました。 。つまり、基本的に、私の質問は次のとおりです。

  • なぜ112を返すのですか?:-)
  • 明示的なキャストの結果はC/Objective-C標準のどこかで定義されていますか、それともコンパイラ固有ですか?
4

3 に答える 3

4

Objective-Cでは、BOOLマクロはtypedeffor signed charwith YES/ NOdefinedですが、実際のブール値であり、またはboolである可能性があります。truefalse

ポインタのアドレスを丸めてsigned char入力するため、112を返します。

ここに良い答えのあるいくつかの議論があります:
Objective-C:BOOL vsboolObjective-c
のYES/NO、TRUE/FALSEとtrue/falseの間に違いはありますか?

于 2012-10-09T21:27:18.983 に答える
1

Cでの「真」の定義は、ゼロ以外の数値です。したがって、Cに関する限り、112は真であると見なされます。C99標準から:

6.3.1.2ブール型

スカラー値が_Boolに変換される場合、値が0と等しい場合、結果は0になります。それ以外の場合、結果は1になります。

_BoolではなくBOOLに変換しているため、値は1に変換されません。0/1への変換は、技術的にはif内で処理されます(実際には、実装はif / while型ステートメント内で(myObject!= 0)になる可能性が高くなります)。

于 2012-10-09T21:24:53.017 に答える
1

Cでは、ブール型boolstdbool.hマクロです_Bool

また、ゼロ以外の整数値をに変換すると、_Boolが生成されることが保証され1ます。

つまり、の結果は1 == (bool) 42です1

BOOLある型を別の整数型(など)のエイリアスとして使用している場合はsigned char、別の結果が得られる可能性があります。

の結果は1 == (BOOL) 42です0

于 2012-10-09T21:29:43.367 に答える