跳到主要內容

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

Mac OS X 10.6 同步收取 Gmail, how?

在 Apple 官方的 Mac OS X 10.6 介紹網頁中, 雖然並沒有在內建的郵件軟體 - Mail 著墨太多. 但是實際上 Mail 也做了一些改善, 讓使用可以更方便, 而這篇文主要目的就是說明怎麼讓 Mail 與 Gmail 進行同步. 在過去使用郵件軟體收取電子郵件的使用經驗中, 往往都需要輸入很多資料, 什麼 "寄件伺服器" "收件伺服器" "通訊協定"... 等等等, 這對一般用戶來說, 只能說是災難. 畢竟沒學過那些專有名詞, 天曉得那是些什麼東西!? 而 Mac OS X 10.6 中的 Mail 不同了, 現在只需要輸入 Email 帳號及密碼, 軟體自動搞定細部設定! 有沒有這麼簡單!? 手邊有 Hotmail 的朋友可以試試看, 只要輸入帳號密碼, 10.6 的 Mail 就會幫你設定好其它需要設定的資料. 不過今天的主角是 Gmail 啦! 而要使用的是 Gmail 提供的 IMAP 的功能, 在使用前得先到 Gmail 中進行一些簡單的設定, 當然小弟也會說明這樣設定的理由 :) OK! Here we go!!!

世界第一! 臺灣的驕傲! 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 全球最貴!!??