作者sluggard (~Halcyon Days~)
看板java
标题[问题] if 和 else if 的问题
时间Sun Mar 13 19:58:28 2022
最近开始学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://webptt.com/cn.aspx?n=bbs/java/M.1647172710.A.192.html
1F:推 gasbomb: 用debugger一步一步看吧 常看就习惯了 03/13 20:21
2F:→ GGing: 这跟程式语言无关,单纯逻辑问题 03/13 21:23
3F:→ sluggard: 喔~可能真的是逻辑,因为我真的还没想通为什麽不能用 03/13 22:02
4F:→ sluggard: if,一定要用else if,而且基本观念理解却无法应用妥当 03/13 22:03
5F:推 snowlike: 因为你的第三个 if 把前面已经判断过的res覆写掉了 03/13 22:13
6F:→ ssccg: 其实java没有elseif,只有else後接的是个if statement 03/13 23:13
7F:→ ssccg: 你把else的括号补上去就知道差在哪了 03/13 23:13
真的非常谢谢您!不过我还是有点不懂您所说的是什麽意思...
不是有if...else if....else if ...else 和
if...if...if...else...两种吗?
8F:→ ssccg: 至於你写的程式,你最後的else相当於if (str.length() <= 2 03/13 23:19
9F:→ ssccg: || !(str.substring(0,2).equals ...)) 跟你的结果符合啊 03/13 23:21
10F:→ ssccg: 「尤其我一开始就已经写了如果string的长度是2,就应该retu 03/13 23:22
11F:→ ssccg: rn ""」这句,你往上看看你写的明明是 result = "",并没有 03/13 23:23
12F:→ ssccg: return "",程式是照你写的跑的,不是照你认为的跑的 03/13 23:23
谢谢您!不过我的else那里不是应该是相当於if (str.length()>2 && ...)
为什麽您觉得是<=2 || ?
我把我的思路一步一步写清楚,还是不了解为什麽一模一样的code
改成else if就对(我有附上图)
13F:→ ssccg: 只有你写错,没有什麽一定要用else if 03/13 23:24
谢谢您,的确向您所说,需要一步骤一步骤看,但我还是没想通,
因为我的逻辑一开始就是
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
14F:→ ssccg: 这种基本的control statement,你不能只是模糊的记说很多个 03/13 23:27
15F:→ ssccg: if连续大概怎样,你要很明确的知道你写的每一个if,会造成 03/13 23:29
16F:→ ssccg: 程式依什麽顺序执行,哪几行是条件成立时会执行的,哪几行 03/13 23:32
17F:→ ssccg: 是条件不成立执行的,哪几行是一定会执行的 03/13 23:32
谢谢您,这真的是我最想搞清楚的...我也一直一点一点想,
但不知道自己的盲点在哪
我把图放上去可能比较清楚,
希望能真正明确的了解,谢谢您的帮忙!
※ 编辑: sluggard (61.227.39.208 台湾), 03/14/2022 01:02:46
18F:→ qrtt1: 讲那麽多,有没有先依着前面推荐的 debugger 去走一遍流程? 03/14 09:01
19F:→ sluggard: 谢谢大家的建议!我是线上练习,不懂怎麽debug,不会我 03/14 12:07
20F:→ sluggard: 尽快学怎麽在Eclipse里面练习debug,而不是直接在线上写 03/14 12:09
21F:→ MonyemLi: 程式由上而下执行,只有几个指令能跳出。else if 不能 03/17 16:34
22F:→ MonyemLi: 独立使用,是if命令的选用 03/17 16:34
23F:推 aidansky0989: 顺序结构、分支结构、循环结构统称编程第一范式, 04/04 14:35
24F:→ aidansky0989: 可以验证所有的执行结果 04/04 14:35
25F:→ roshia: 回传值为String的方法,在该return的时候没return,要马补 04/23 21:30
26F:→ roshia: 上return 要马补上else 04/23 21:30
27F:→ didibi: 不知道问题解决了吗?我在想应该是因为最後一个if…else 05/09 23:01
28F:→ didibi: 的部分,你认为的else是指「除了以上有列出以外的所有情 05/09 23:01
29F:→ didibi: 况」,但实际上这里的else指的是「除了最後一个if以外的 05/09 23:01
30F:→ didibi: 情况」(字的长度没有大於二,或是…) 05/09 23:01
31F:→ didibi: 如果是用一个if後面else if的话就会先判断,不符合再往下 05/09 23:01
32F:→ didibi: 一个判断,比较符合你的逻辑~ 05/09 23:01