BOOLでちょっとしたお遊び

Objective-Cでは、
boolean型としてBOOLが提供されています。
ふと思いついたので、
BOOLで少しばかし遊んでみようかと思います。
内容はしょうもないですけどね。


下のコードみたいなことをしても、大丈夫なのです。
ただし、おすすめはしない。
というかやるべきではない。

BOOL str[] = "abCdef";
// アルファベットの小文字は大文字へ
// 大文字は小文字へ
printf("before onvert:%s\n", str);
for ( int i=0; i<strlen( (char*)str ); i++) {
    if ( 65 <= str[i] && str[i] <= 90)
        str[i] += 32;
    else if ( 97<= str[i] && str[i] <= 119)
        str[i] -= 32;
}
printf("after onvert:%s\n", str);

BOOLの正体について

上のコードについては
BOOLの正体を知っている方、もしくは、察しの良い方にとっては、
「あぁ〜」
って感じでしょうか。
なにはともあれ、友達と仲良くなるには、
まず相手のことを知っていく必要があります。
では、早速BOOLを丸裸にしてやりましょう。
objc.hにBOOLの定義が書かれています。

BOOL は signed char で typedefされたもの

google style guide では、
 unsigned charと記述されていますが、
 実際にobjc.hを見るとsigned char でした。
 まぁ、何かがあったのでしょう。)
そう、BOOLの正体はsigned char でした。
では、YES と NO はというと、
それぞれ1と0をBOOLでキャストしたものです。


そして、上記コードからも分かる通り

BOOL は YES/NO 以外の値も取り得る

ことがわかります。
変な書き方するとバグ発生です。
BOOL型にキャストされたものとYESを比較したりとか。。。
気をつけましょう。