跳到主要內容

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

第二章 緊急返鄉 - 推著爺爺去散步

也許是曾經身為軍人的關係, 爺爺很排斥使用輪椅... 也許是曾經身為一家之主的榮耀, 縱使小便不方便卻堅持不肯使用尿壺... 也許就是因為爺爺是爺爺, 所以很少開口要我幫忙他些什麼凡是自己來, 總是他在給我, 我卻很少能給他什麼... 只是兩次的手術, 在病床上躺久了, 他的身體狀況真的大不如前... 沒辦法想自己起來走走就走走, 想坐到沙發就坐到沙發, 想拿起遙控器看看電視就拿, 想回房休息就回房間. 這樣的光景, 以前是再熟悉不過的... 很希望爺爺真的能趕快好起來, 而回家時一切都沒變, 爺爺看到我回家開心大笑起身握握我的手... 現在的他, 只能任我們宰割... 儘管他再怎麼使勁, 那纖細的雙腿依然撐不住他的身子, 不喜歡輪椅也得坐輪椅... 儘管他再怎麼不願意, 行動不方便的他還是被我們包了尿布, 不喜歡尿布也得包尿布... 爺爺一點點的隱私, 一點點的尊嚴也不剩, 連不願意吃飯, 都被我們直接灌食, 連絕食的權力都沒有...