作者ssccg (23)
看板java
標題Re: [問題] if 和 else if 的問題
時間Mon Mar 14 02:05:18 2022
: → ssccg: 其實java沒有elseif,只有else後接的是個if statement 03/13 23:13
: → ssccg: 你把else的括號補上去就知道差在哪了 03/13 23:13
: 真的非常謝謝您!不過我還是有點不懂您所說的是什麼意思...
: 不是有if...else if....else if ...else 和
: if...if...if...else...兩種嗎?
沒有兩種
只有 if-else 一種
if ( Expr1 ) {
Stmts1
} else if ( Expr2 ) {
Stmts2
} else {
Stmts3
}
其實相當於
if ( Expr1 ) {
Stmts1
} else {
if ( Expr2 ) {
Stmts2
} else {
Stmts3
}
}
else if 寫法只是else內容是又一個 if-else 的簡短寫法
調整過縮排後就很清楚
整段程式的所有Statements都是屬於第一個 if-else 控制的範圍內
Stmts2、3會不會執行跟第一個 if 是有關係的
而
if ( Expr1 ) {
Stmts1
}
if ( Expr2 ) {
Stmts2
} else {
Stmts3
}
第一個 if 控制的範圍就到 Stmts1而已
後面的Stmts2、3會不會執行就跟第一個 if 完全沒有關係
else if 不只是在 if 前面加個 else 這麼簡單
整個程式的結構是完全不一樣的
: → ssccg: 至於你寫的程式,你最後的else相當於if (str.length() <= 2 03/13 23:19
: → ssccg: || !(str.substring(0,2).equals ...)) 跟你的結果符合啊 03/13 23:21
: → ssccg: 「尤其我一開始就已經寫了如果string的長度是2,就應該retu 03/13 23:22
: → ssccg: rn ""」這句,你往上看看你寫的明明是 result = "",並沒有 03/13 23:23
: → ssccg: return "",程式是照你寫的跑的,不是照你認為的跑的 03/13 23:23
: 謝謝您!不過我的else那裡不是應該是相當於if (str.length()>2 && ...)
: 為什麼您覺得是<=2 || ?
: 我把我的思路一步一步寫清楚,還是不了解為什麼一模一樣的code
: 改成else if就對(我有附上圖
: → ssccg: 只有你寫錯,沒有什麼一定要用else if 03/13 23:24
: 謝謝您,的確向您所說,需要一步驟一步驟看,但我還是沒想通,
: 因為我的邏輯一開始就是
// 你這段程式我的看起來是長這樣
: public String without2(String str) {
// 定義一個變數 result,初始值設成 "";
: String result = "";
// 執行到此,如果str的長度等於2,把變數result 設成 ""
: if ((str.length() == 2)){
: result = "";
: }
// 執行到此,如果str的長度小於2,把變數result 設成 str
: if (str.length() < 2){
: result = str;
: }
// 執行到此,如果str的長度大於2,而且str最前面的兩個字母和最後的兩個字母一樣
: if ((str.length()>2) &&
: (str.substring(0,2).equals(str.substring(str.length()-2,str.length())))){
// 把 result 設成 str 去掉前兩個字元的字串值
: result = str.substring(2, str.length());
// 如對應的 if 不成立(字的長度小於或等於2,或前兩個字母和最後兩個字母不一樣)
: } else {
// 把 result 設為 str
: result = str
: }
// 完整的 if-else 會包含全部的情況
// 所以執行到此,result 的初始值和前兩個 if 完全多寫的
// result 目前的值只看最後這個 if-else
// 執行到此,不管上面執行了什麼,回傳現在 result 的值
: return result;
: }
再讓我提一次你這句
「尤其我一開始就已經寫了如果string的長度是2,就應該return ""」
整段程式看下來顯然沒這回事,最後面才有return
反而是如果你沒有多用 result 這個變數
而是每個 if 裡面真的是直接寫 return
那就會跟你想的一樣
但是你用的就不是 return
: 但這樣時就會有錯 (我貼上圖可能比較清楚)
: https://imgur.com/Rcch9FN
:
: 但一模一樣寫法,只要改成else if就對了 (同樣也貼上圖)
: https://imgur.com/jclPYLb
你把 else if 照前面展開成適當的縮排
你就知道兩段程式流程控制結構完全不一樣
不是一模一樣的寫法
:
: → ssccg: 這種基本的control statement,你不能只是模糊的記說很多個 03/13 23:27
: → ssccg: if連續大概怎樣,你要很明確的知道你寫的每一個if,會造成 03/13 23:29
: → ssccg: 程式依什麼順序執行,哪幾行是條件成立時會執行的,哪幾行 03/13 23:32
: → ssccg: 是條件不成立執行的,哪幾行是一定會執行的 03/13 23:32
:
: 謝謝您,這真的是我最想搞清楚的...我也一直一點一點想,
: 但不知道自己的盲點在哪
: 我把圖放上去可能比較清楚,
: 希望能真正明確的瞭解,謝謝您的幫忙!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.150.124.138 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1647194720.A.03C.html
※ 編輯: ssccg (118.150.124.138 臺灣), 03/14/2022 02:07:06
1F:推 sluggard: 真的非常非常謝謝您這麼詳細的解說!我真的學到好多... 03/14 12:12
2F:→ sluggard: 原來我整個思維都錯了,而且連return的用法都不是很清楚 03/14 12:13
3F:推 sluggard: 甚至return的位置讓output全錯亂我都沒發現,學得太差了 03/14 12:18
4F:推 sluggard: 謝謝您花這麼多時間一步一步講解!真的受益良多! 03/14 12:20