Macで clang -ObjC -framework Foundation non-nil-to-false.m && ./a.out
すると実行できます。
#import <Foundation/Foundation.h>
int main() {
NSObject *value = (id)0x100;
NSLog(@"value = %d", (BOOL)value); // value = 0
NSLog(@"value = %d", (_Bool)value); // value = 1
return 0;
}
理由はBOOLの定義が以下のようになっているから。
// in objc/objc.h
/// Type to represent a boolean value.
#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__
typedef bool BOOL;
#else
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
まあいろいろ歴史的経緯があるんでしょうけど、たとえ BOOL
を使っているとしても、キャストするなら (_Bool)
または (bool)
とするのがよさそうです。あるいは !!expr
や expr ? YES : NO
とか。