跳到主要內容

關於 condition 的原來如此

記得剛學習寫程式時, 寫到關於 condition 的表示式時, 偶而會碰到這樣的窘境.
if (amount = 0) {
      // do something 1
} else if (amont > 0) {
      // do something 2
} else {
      // do something 3
}
乍看之下似乎沒啥問題, 但實際上問題可大了!! 因為第一個 condition 寫成了 assignment. 導致整個 if-else 的判斷式, 永遠只會跑到 // do something 3 的區段.
如果第一個 condition 換成 amount = 1 時, 結果又會是如何呢?
答案是 => 永遠只會跑到 // do something 1 的區段. WHY???

很多老師都會用心良苦的跟學生說 “=” 和 “==” 是不同的, 寫 assignment 的時候用的是 “=”, 寫 conditon 的時候, 用的是 “==”.很多學生也就這麼記下來了, 但永遠不了解為什麼 condition 裡頭會是這個樣子, 一樣都是寫錯, =0 和 =1 的結果卻不同.

那何時 condition 會成立? 也就是 condition 內容為真, 那什麼叫做內容為真? 看一下在 Objective-C 之中 BOOL、YES 和 NO 的定義:
typedef signed char          BOOL;
#define YES                (BOOL)1
#define NO                 (BOOL)0
這下就很清楚了, 不成立的狀況 (NO) 就是 0, 這也解釋了為何上述例子 amount = 0 會這樣運作.
雖然 YES 為 1, 但其實 condition 的成立條件為 !NO (非 0), 也就是說不管上述第一個 condition 中的 amount assign 的數字是多少, 只要不是 0, 這個 condition 通通會成立.

講這麼多, 其實只要能確實了解 “=” 和 “==” 之間的差異, 就沒什麼大問題.
但如果一時不察用錯了怎麼辦? 那剛剛上面一大篇枯燥無味的基礎知識, 就可以幫助你快速的找出這個僅有一字元之差的小 bug. 而不會花了一個晚上想破頭, 最後還不見得能發現原來只是把 “==” 寫成了 “=”.

留言

java 好像會自動提醒在if 裡面 只能放== 而不是 =
阿刃寫道…
to 小 k:
請問您是... 爽爽替代役學弟嗎? ="=bbb 如果猜錯還請見諒... XDDD

好啦回到問題點關於 java 的 boolean,
java 中的 boolean 是一種 primitive data type!
這和 C 不一樣! 也就是對 JVM 來說, 天生就認得 boolean. 而 boolean 的值只有 true 或 false. 那一個 boolean 多大的記憶體空間? 1 bit? 1byte? 這得看 JVM 怎麼實作.
也因此 condition 需要的資料形態是 boolean, 自然而然可以避開這個問題.

附帶一提, Objective-C 的官方文件中提到, "A Boolean value, either YES or NO. Note that the type of BOOL is char."
實際上 BOOL 的宣告呢?
=> typedef signed char BOOL;

這個網誌中的熱門文章

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

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

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

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

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