Re: [閒聊] 真的有扯到...

看板Soft_Job作者 (亞布里艾爾發芽>//<)時間12年前 (2012/03/30 19:44), 編輯推噓5(504)
留言9則, 7人參與, 最新討論串12/13 (看更多)
※ 引述《erspicu (.)》之銘言: : 有時候亂七八糟的書或是亂七八糟的講師 : 真的害死人... : 話說我有兩個寫Java的同事 : 都有一個很奇怪的觀念 : 這種巧合機率極低 但是卻發生了 : 讓我懷疑他們應該是看到同一本書或是上了同一講師的課誤導 : | vs || 的差異 : 底下是他們認為 : |是指 不管前條件為真或是偽 都會進行後條件的計算 : => true | false -> true : false | true -> false : ||是指 如果前條件為偽 則回傳為偽 跳出 不進行後條件計算 : 如果前條件為真 則進行後條件計算 : => false || true -> false : true || false -> false : true || true -> true : 以上是他們認為 這個顯然是錯的 至於為什麼會有這個誤解 可能是以下這個觀念沒搞清楚: public class Test { private static int calledTime = 0; public static void main(String[] args) { if(true || calledSecondTime()) { //calledSecondTime()不會被執行 System.out.println("True"); } else { System.out.println("False"); } System.out.println("calledTime = " + calledTime); if(false || calledSecondTime()) { //calledSecondTime()會被執行 System.out.println("True"); } else { System.out.println("False"); } System.out.println("calledTime = " + calledTime); } private static boolean calledSecondTime() { calledTime++; return calledTime == 2; } } --------------------------------------------------------------------- Output: True calledTime = 0 False calledTime = 1 ===================================================================== public class Test { private static int calledTime = 0; public static void main(String[] args) { if(true | calledSecondTime()) { //calledSecondTime()會被執行 System.out.println("True"); } else { System.out.println("False"); } System.out.println("calledTime = " + calledTime); if(false | calledSecondTime()) { //calledSecondTime()會被執行 System.out.println("True"); } else { System.out.println("False"); } System.out.println("calledTime = " + calledTime); } private static boolean calledSecondTime() { calledTime++; return calledTime == 2; } } --------------------------------------------------------------------- Output: True calledTime = 1 True calledTime = 2 ===================================================================== 正確的說法應該是: | 不管前條件為真或是偽 都會進行後條件的計算 => true | f() -> true //f()會被執行 false | f() -> f() //f()會被執行 || 如果前條件為真 則回傳為真 跳出 不進行後條件計算 (我不是很確定JAVA有沒有規範這點 記得C是不保證執行或不執行 視實作而定) 如果前條件為偽 則進行後條件計算 => true || f() -> true //f()不會被執行 false || f() -> f() //f()會被執行 &和&&同理 當然&&是在前條件為偽時直接回傳 |和&基本上是位元運算子而不是邏輯運算子 需要把兩邊的值都計算完畢後才能進行運算 另外 用|和&來做邏輯計算 只要兩邊都是boolean 結果會是對的 但是並不直覺...... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.249.229 ※ 編輯: Ayukawayen 來自: 220.135.249.229 (03/30 19:50)

03/30 20:30, , 1F
C 語言標準有保證 short-circuit evaluation
03/30 20:30, 1F

03/30 20:42, , 2F
這ID好像是小善大大 @.@
03/30 20:42, 2F

03/30 21:22, , 3F
03/30 21:22, 3F

03/31 17:21, , 4F
一目瞭然.推
03/31 17:21, 4F

04/01 09:54, , 5F
這篇解答很清楚
04/01 09:54, 5F

04/01 12:48, , 6F
這裡推解答得很清楚 我那篇推說我同事沒有說錯
04/01 12:48, 6F

04/01 12:48, , 7F
不然你是有人格分裂嗎?
04/01 12:48, 7F

04/01 13:00, , 8F
其實也根本不用解釋那麼多 這只是最基本的邏輯問題罷了
04/01 13:00, 8F

04/02 06:23, , 9F
長知識
04/02 06:23, 9F
文章代碼(AID): #1FTPolp6 (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1FTPolp6 (Soft_Job)