[問題] if 和 else if 的問題

看板java作者 (~Halcyon Days~)時間2年前 (2022/03/13 19:58), 2年前編輯推噓3(3029)
留言32則, 10人參與, 2年前最新討論串1/2 (看更多)
最近開始學JAVA,一邊練習網路上的題目, 但發現我對於第二次開始使用if 和 else if的用法還是有點不太懂 我查了stackoverflow,上面說到兩者最大的差異就是 如果我用if,就代表不管怎麼樣,系統都會檢視 if(i==0){ executes;} if(i==1){ executes; } // 不管有幾個,系統都會一一檢視,只要符合就會執行 如果是用else if,那第一個條件如果符合, 下面的i==1不管符合不符合都不會執行 if(i==0){ executes;} else if(i==1){ executes;} 我不知道這樣的理解是否正確? 如果是的話,我就不了解為什麼下面這個情況,一定要用else if,而不能用if 我做練習的題目是說: Given a string, if a length 2 substring appears at both its beginning and end, return a string without the substring at the beginning, so "HelloHe" yields "lloHe". The substring may overlap with itself, so "Hi" yields "". Otherwise, return the original string unchanged. 例如: without2("HelloHe") → "lloHe" without2("HelloHi") → "HelloHi" without2("Hi") → "" 所以我試著寫的是: public String without2(String str) { String result = ""; if ((str.length() == 2)){ result = ""; } if (str.length() < 2){ result = str; } if ((str.length()>2) && (str.substring(0,2).equals(str.substring(str.length()-2,str.length())))){ result = str.substring(2, str.length()); } else { result = str; } return result; } 但這樣發現, without2("Hi") → 應該要是"" 但我的卻會跑出"Hi" without2("xx") → 應該要是"" 但我的卻會跑出"xx" 只要我把第二和地三個if ,改成 else if 就全對了 我不懂為什麼這裡一定要用else if呢? 尤其我一開始就已經寫了如果string的長度是2,就應該return "" 為什麼還是會跑出原本的字? 我想請問像我這種問題,要看什麼書才會學得透徹呢? 因為常常有些細節想不明白,我該怎麼學習呢? 謝謝^_^ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.227.39.208 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1647172710.A.192.html

03/13 20:21, 2年前 , 1F
用debugger一步一步看吧 常看就習慣了
03/13 20:21, 1F

03/13 21:23, 2年前 , 2F
這跟程式語言無關,單純邏輯問題
03/13 21:23, 2F

03/13 22:02, 2年前 , 3F
喔~可能真的是邏輯,因為我真的還沒想通為什麼不能用
03/13 22:02, 3F

03/13 22:03, 2年前 , 4F
if,一定要用else if,而且基本觀念理解卻無法應用妥當
03/13 22:03, 4F

03/13 22:13, 2年前 , 5F
因為你的第三個 if 把前面已經判斷過的res覆寫掉了
03/13 22:13, 5F

03/13 23:13, 2年前 , 6F
其實java沒有elseif,只有else後接的是個if statement
03/13 23:13, 6F

03/13 23:13, 2年前 , 7F
你把else的括號補上去就知道差在哪了
03/13 23:13, 7F
真的非常謝謝您!不過我還是有點不懂您所說的是什麼意思... 不是有if...else if....else if ...else 和 if...if...if...else...兩種嗎?

03/13 23:19, 2年前 , 8F
至於你寫的程式,你最後的else相當於if (str.length() <= 2
03/13 23:19, 8F

03/13 23:21, 2年前 , 9F
|| !(str.substring(0,2).equals ...)) 跟你的結果符合啊
03/13 23:21, 9F

03/13 23:22, 2年前 , 10F
「尤其我一開始就已經寫了如果string的長度是2,就應該retu
03/13 23:22, 10F

03/13 23:23, 2年前 , 11F
rn ""」這句,你往上看看你寫的明明是 result = "",並沒有
03/13 23:23, 11F

03/13 23:23, 2年前 , 12F
return "",程式是照你寫的跑的,不是照你認為的跑的
03/13 23:23, 12F
謝謝您!不過我的else那裡不是應該是相當於if (str.length()>2 && ...) 為什麼您覺得是<=2 || ? 我把我的思路一步一步寫清楚,還是不了解為什麼一模一樣的code 改成else if就對(我有附上圖)

03/13 23:24, 2年前 , 13F
只有你寫錯,沒有什麼一定要用else if
03/13 23:24, 13F
謝謝您,的確向您所說,需要一步驟一步驟看,但我還是沒想通, 因為我的邏輯一開始就是 public String without2(String str) { //我先把結果寫成String result = ""; String result = ""; // 如果字的長度等於2,我的result就是"" empty string if ((str.length() == 2)){ result = ""; } // 如果字的長度小於2,result就等於原本的字 if (str.length() < 2){ result = str; } // 如果字的長度大於2,而且字最前面的兩個字母和最後的兩個字母一樣的話 if ((str.length()>2) && (str.substring(0,2).equals(str.substring(str.length()-2,str.length())))){ // result 就把字的前兩個字元刪掉 result = str.substring(2, str.length()); // 其他的情形,(字的長度大於2 而且&&字的前兩個字母和最後兩個字母不一樣) } else { // result 就是原本的字 result = str } // 根據上面各種情況決定result是哪一個 return result; } 但這樣時就會有錯 (我貼上圖可能比較清楚) https://imgur.com/Rcch9FN
但一模一樣寫法,只要改成else if就對了 (同樣也貼上圖) https://imgur.com/jclPYLb

03/13 23:27, 2年前 , 14F
這種基本的control statement,你不能只是模糊的記說很多個
03/13 23:27, 14F

03/13 23:29, 2年前 , 15F
if連續大概怎樣,你要很明確的知道你寫的每一個if,會造成
03/13 23:29, 15F

03/13 23:32, 2年前 , 16F
程式依什麼順序執行,哪幾行是條件成立時會執行的,哪幾行
03/13 23:32, 16F

03/13 23:32, 2年前 , 17F
是條件不成立執行的,哪幾行是一定會執行的
03/13 23:32, 17F
謝謝您,這真的是我最想搞清楚的...我也一直一點一點想, 但不知道自己的盲點在哪 我把圖放上去可能比較清楚, 希望能真正明確的瞭解,謝謝您的幫忙! ※ 編輯: sluggard (61.227.39.208 臺灣), 03/14/2022 01:02:46

03/14 09:01, 2年前 , 18F
講那麼多,有沒有先依著前面推薦的 debugger 去走一遍流程?
03/14 09:01, 18F

03/14 12:07, 2年前 , 19F
謝謝大家的建議!我是線上練習,不懂怎麼debug,不會我
03/14 12:07, 19F

03/14 12:09, 2年前 , 20F
盡快學怎麼在Eclipse裡面練習debug,而不是直接在線上寫
03/14 12:09, 20F

03/17 16:34, 2年前 , 21F
程式由上而下執行,只有幾個指令能跳出。else if 不能
03/17 16:34, 21F

03/17 16:34, 2年前 , 22F
獨立使用,是if命令的選用
03/17 16:34, 22F

04/04 14:35, 2年前 , 23F
順序結構、分支結構、循環結構統稱編程第一範式,
04/04 14:35, 23F

04/04 14:35, 2年前 , 24F
可以驗證所有的執行結果
04/04 14:35, 24F

04/23 21:30, 2年前 , 25F
回傳值為String的方法,在該return的時候沒return,要馬補
04/23 21:30, 25F

04/23 21:30, 2年前 , 26F
上return 要馬補上else
04/23 21:30, 26F

05/09 23:01, 2年前 , 27F
不知道問題解決了嗎?我在想應該是因為最後一個if…else
05/09 23:01, 27F

05/09 23:01, 2年前 , 28F
的部分,你認為的else是指「除了以上有列出以外的所有情
05/09 23:01, 28F

05/09 23:01, 2年前 , 29F
況」,但實際上這裡的else指的是「除了最後一個if以外的
05/09 23:01, 29F

05/09 23:01, 2年前 , 30F
情況」(字的長度沒有大於二,或是…)
05/09 23:01, 30F

05/09 23:01, 2年前 , 31F
如果是用一個if後面else if的話就會先判斷,不符合再往下
05/09 23:01, 31F

05/09 23:01, 2年前 , 32F
一個判斷,比較符合你的邏輯~
05/09 23:01, 32F
文章代碼(AID): #1YBTnc6I (java)
文章代碼(AID): #1YBTnc6I (java)