作者Ayukawayen (亞布里艾爾發芽>//<)
看板Soft_Job
標題Re: [閒聊] 真的有扯到...
時間Fri Mar 30 19:44:43 2012
※ 引述《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