看板 Soft_Job 關於我們 聯絡資訊
※ 引述《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)
littleshan:C 語言標準有保證 short-circuit evaluation 03/30 20:30
Ayukawayen:這ID好像是小善大大 @.@ 03/30 20:42
fantasycloud:推 03/30 21:22
comput:一目瞭然.推 03/31 17:21
feeya:這篇解答很清楚 04/01 09:54
erspicu:這裡推解答得很清楚 我那篇推說我同事沒有說錯 04/01 12:48
erspicu:不然你是有人格分裂嗎? 04/01 12:48
erspicu:其實也根本不用解釋那麼多 這只是最基本的邏輯問題罷了 04/01 13:00
gn00295120:長知識 04/02 06:23