Re: [閒聊] 真的有扯到...
※ 引述《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
03/30 20:30, 1F
→
03/30 20:42, , 2F
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
討論串 (同標題文章)