跳到主要內容

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

世界第一! 臺灣的驕傲! iPod 全球最貴 XD!!??

2009 年 9 月 10 日 凌晨 1 點鐘, Apple 於美國舉行了 Apple Special Event September 2009 . 先說點題外話, 這場演說對 Apple 迷而言, 是久違的一場, 也不知道還能有幾場像這場一樣, 由 Steve Jobs 親自站臺. 這場演說的主題, 除了 iTunes 9, iPhone (iPod touch) OS 更新為 3.1 外, 就是 iPod 產品線的更新. 在看完發表會之後, 我去研究了一下新 iPod 的全球售價, 這也是這篇文章的重點, 蘋果臺灣的定價創下了新的紀錄- 套用一下最近常聽到的 Slogan 世界第一, 臺灣的驕傲, iPod 全球最貴!!??

關於 Polymorphism! 是的, 就是多型!

這幾天真的是寫了好多關於程式基礎的東西, 今天心血來潮想寫個物件導向的特性 - Polymorphism. 是的, 你沒看錯, 就是多型. 多型, 這有什麼好寫的呀? 每本物件導向的書籍, 不管是程式語言或是方法論, 一定都會提到的基本特性. 去書局翻翻就有了, 甚至在網路上搜尋 “物件導向” “多型”, 就可以找到讀也讀不完的資料. 在這老調重彈, 似乎有點... 多餘? 會想把這個議題拿出來講, 關鍵就在於我發現 Objective-C 上的多型, 和我以前認識的不太一樣, 更加 Powerful.