跳到主要內容

關於 BOOL 的原來如此

上次寫了篇 “關於 condition 的原來如此” 後, 仔細思索了在 Objective-C 中 BOOL 這種形態可能會發生的問題. 在 Java 中的 boolean 是一個 type safe 的資料形態, 也就是除了 true 和 false 之外, boolean 不能存其它數值.
但在 Objective-C 中呢?
=> BOOL 和 YES 與 NO 的關係可不像 Java 中的 boolean 那麼簡單.

再看一次 BOOL、YES 與 NO 的定義:
typedef signed char          BOOL;
#define YES                (BOOL)1
#define NO                 (BOOL)0
很清楚的, BOOL 的資料形態是 signed char, 而 YES 與 NO 分別為數值為 1 和 0 的 BOOL.
由 BOOL 的資料形態我們可以發現, 只要是合法的 signed char 都可以存入 BOOL 之中. 這意味著 BOOL 不單單能存 YES 與 NO 這兩種數值, 也就是 BOOL 並不是一個 type safe 的 boolean 形態.

看到這也許會有個疑問
=> 反正在 condition 中, 0 代表 false, 非 0 代表 true, 就算 BOOL 可以存 0 (NO) 與 1 (YES) 以外的數值也不會造成什麼影響.

其實是有影響的! 看個簡單的範例.
BOOL isBool = 2;
if (isBool) {
    NSLog(@"isBool? YES");
}
if (isBool != YES) {
    NSLog(@"isBool? NO");
}
因為 BOOL 不是個 type safe 的 boolean, 不限只能使用 YES 或 NO 指派, 於是範例中使用了一個代表 true 的非 0 數值進行指派. 那麼, 程式執行完的結果會是如何?
isBool? YES
isBool? NO
這下可好了, isBool 為 true 但卻不等於 YES.
原因就在於 YES 代表的數值是 1, 而非所有非 0 的數值.

有趣吧? 在 Objective-C 使用 BOOL 時, 得謹慎些, 別誤以為 BOOL 是個 type safe 的 boolean 形態, 而發生了上頭這樣的錯誤.

留言

這個網誌中的熱門文章

誰讓你心動, 誰讓你心痛, 誰會讓你偶而想要擁他在懷中... 誰又在乎你的夢, 誰說你的心思他會懂, 誰為你感動... 許久沒聽到這熟悉的詞與曲, 更懷念那甜美細膩的好嗓音. 於是趁著空檔, 拿出了放在那如同收藏我的回憶般, 收藏櫃子裡頭的兩張專輯.

引數?! 參數??!! 什麼鬼啊!!

我想這個不僅是只有我會遇到的問題, 大概也是所有 Programming 的人都有的疑惑 (應該是吧?) 什麼引數?? 什麼參數?? 天啊... 到底是誰翻譯的呀!!!! 就字面上來看... 講句實在話, 我真的不了解, 大概是學藝不精所致. 也許有些人認為 => 管它那麼多!! 寫得出來就好了!! 不過龜毛如我, 我還是想搞清楚定義是什麼!

關於 Objective-C 的基本功

就在 iPhone 開創了智慧型手機軟體市場後, 市面上出現了很多關於 iPhone 平臺的開發教學書籍. 但是, 關於 iPhone 使用的程式語言 Objective-C 的書呢? 這種練基本功的書籍卻是少得可憐. 而龜毛如我, 只曉得怎麼使用 Cocoa framework, 卻不曉得基礎程式語言怎麼運作, 老是覺得渾身不自在. 就在打算入手 "Programming in Objective-C 2.0" 這本英文書的同時... 我發現 => 中文版出了!!!! 這對要使用 Objective-C 來寫程式的我, 無疑是一種福音. 無論是在價格上, 或使用的文字上. XDDD~