Java语言中有if和switch两种条件选择语句。if条件语句是各种程序设计语言中常见的条件选择语句,就是根据所指定的“条件判断表达式”进行判断,用判断的结果来决定程序该执行哪一个程序分支。if条件语句分为三种,分别是if、if-else和if-else-if语句,表3-1所示是它们的语法。
表3-1
if条件选择语句只有在“条件判断表达式”的结果是true时(条件成立时),才会选择进入其中的“程序语句区块”(或称为程序语句片段);如果条件不成立(条件判断表达式的结果为false),就会跳离if条件选择语句。if语句的语法如下:
if (条件判断表达式) {// 条件判断表达式可以是“比较两者之间的关系”,或者复杂的“条件表达式” 程序语句区块; }
当if的条件判断表达式结果为true时,才会执行“程序语句区块”的部分;如果条件判断表达式的结果是false,就不会执行“程序语句区块”的部分。
例如:
if (a < b) { System.out.println ("比较结果正确"); }
又如若要判断a的值比0大,则打印输出“正整数”,语句如下:
if (a >0) { System.out.println ("正整数"); }
【范例程序:CH03_01】
01 /*文件:CH03_01.java 02 *说明:if条件选择语句 03 */ 04 05 public class CH03_01 { 06 public static void main(String[] ages) { 07 08 //if条件选择语句使用范例 09 int Tim=20,Tracy=23; 10 System.out.println("Tim年龄="+Tim+",Tracy年龄="+Tracy); 11 12 if (Tim<Tracy){ 13 System.out.println("Tim年龄比Tracy小"+'\n'); 14 } 15 16 Tim=25; 17 System.out.println("Tim年龄="+Tim+",Tracy年龄="+Tracy); 18 if (Tim>Tracy){ 19 System.out.println("Tim年龄比Tracy大"+'\n'); 20 } 21 22 Tim=23; 23 System.out.println("Tim年龄="+Tim+",Tracy年龄="+Tracy); 24 if (Tim==Tracy){ 25 System.out.println("Tim年龄和Tracy一样"); 26 } 27 } 28 }
【程序的执行结果】
程序的执行结果可参考图3-5。
图3-5
【程序的解析】
第09行:声明变量Tim和Tracy,并赋予初始年龄,Tim是20岁、Tracy是23岁。
第12行:if条件选择语句的条件判断表达式为“Tim<Tracy”,如果条件成立(true),就显示“Tim年龄比Tracy小”。如果条件不成立(false),就不再继续往下执行if条件选择语句(第12~14行的程序代码),离开此段程序代码,继续往下执行。
第16行:更改Tim的年龄,将Tim赋值为25,即25岁。if条件选择语句的条件判断表达式为“Tim>Tracy”,如果该条件成立(true),就显示“Tim年龄比Tracy大”;如果该条件不成立(false),就不再继续往下执行if条件选择语句(第18~20行的程序代码),离开此段程序代码,继续往下执行。
第22行:更改Tim的年龄,将Tim赋值为23,即23岁。if条件选择语句的条件判断表达式为“Tim==Tracy”,如果该条件成立(true),就显示“Tim年龄和Tracy一样”;如果该条件不成立(false),就不再继续往下执行if条件选择语句(第24~26行的程序代码),离开此段程序代码。
在3.2.1小节的if条件选择语句中,只有条件成立才会执行“{”和“}”大括号内的语句,如果条件不成立,就跳出if条件选择语句,没有任何打印输出的内容。但是,如果条件不成立时有另外的程序执行分支,就可以考虑使用if-else条件选择语句。例如,当if条件判断表达式结果为true时,执行“程序语句区块(1)”;当条件判断表达式结果为false时,执行“程序语句区块(2)”。if-else条件选择语句的语法如下:
【if-else条件选择语句的语法】
if (条件判断表达式) { 程序语句区块 (1); } else { 程序语句区块 (2); }
例如要设计一段程序代码,如果a的值比b的值小,就打印输出“比较结果正确”;否则打印输出“比较结果不正确”,这段程序代码的编写如下:
if (a < b) { System.out.println ("比较结果正确") ; }else { System.out.println ("比较结果不正确") ; }
值得注意的是“程序语句区块”定义的问题,也就是大括号的标示问题,尤其是else之后的程序语句区块部分要记得加上大括号的标示,否则无法正确执行。
【范例程序:CH03_02】
01 /*文件:CH03_02.java 02 *说明:if-else条件选择语句 03 */ 04 05 public class CH03_02{ 06 public static void main(String[] ages) { 07 08 //if-else条件选择语句使用范例 09 int Tim=27,Tracy=23; 10 System.out.println("Tim年龄="+Tim+",Tracy年龄="+Tracy); 11 12 if (Tim<Tracy) { 13 System.out.println("Tim年龄比Tracy小"+'\n'); 14 }else { 15 System.out.println("Tim年龄比Tracy大"); 16 } 17 } 18 }
【程序的执行结果】
程序的执行结果可参考图3-6。
图3-6
【程序的解析】
第12行:条件判断表达式为“Tim<Tracy”。如果条件成立,就显示“Tim年龄比Tracy小”;如果条件不成立,就显示“Tim年龄比Tracy大”。
第14行:加入else的语句,增加了条件不成立时的程序执行分支,加强了判断结果的明确性。
if-else-if条件选择语句是if条件选择语句的变形,用来判断多个条件。此条件选择语句可以使用else if判断多个条件,当其中某个if条件判断表达式为true时,就会执行它对应的程序语句区块。if-else-if语句执行条件判断表达式的顺序是自上而下,每次遇到if语句就需要进行“条件判断”,如果一直到最后所有的if语句都不成立,就执行最后一个else的程序语句区块。这种用法可以指定需要判断的各种情况,也能了解当条件不成立时原因为何。if-else-if条件选择语句的语法如下:
if (条件判断表达式) { 程序语句区块 (1); }else if (条件判断表达式) { 程序语句区块 (2); }else { 程序语句区块 (3); }
例如:
if (a < b) { System.out.println ("比较结果正确 a<b") ; }else if (a>b) { System.out.println ("比较结果正确 a>b") ; } else { System.out.println ("两个数值相同") ; }
【范例程序:CH03_03】
01 /*文件:CH03_03.java 02 *说明:if-else-if条件选择语句(1) 03 */ 04 05 public class CH03_03 { 06 public static void main(String[] ages) { 07 08 //if-else-if条件选择语句使用范例 09 int Tim=27,Tracy=23; 10 System.out.println("Tim年龄="+Tim+",Tracy年龄="+Tracy); 11 12 if (Tim<Tracy){ 13 System.out.println("Tim年龄比Tracy小"+'\n'); 14 }else if (Tim>Tracy){ 15 System.out.println("Tim年龄比Tracy大"+'\n'); 16 }else{ 17 System.out.println("Tim和Tracy年龄相同"); 18 } 19 20 Tim=23; 21 System.out.println("Tim年龄="+Tim+",Tracy年龄="+Tracy); 22 if (Tim<Tracy){ 23 System.out.println("Tim年龄比Tracy小"+'\n'); 24 }else if (Tim>Tracy){ 25 System.out.println("Tim年龄比Tracy大"+'\n'); 26 }else{ 27 System.out.println("Tim和Tracy年龄相同"); 28 } 29 } 30 }
【程序的执行结果】
程序的执行结果可参考图3-7。
图3-7
【程序的解析】
第20行:设置Tim的年龄为23岁,和Tracy相同。于是条件判断的结果一直到第26行程序语句才得知,两人的年龄既没有“Tim比Tracy大”,也没有“Tim比Tracy小”,则最终的结果显示为“Tim和Tracy年龄相同”。
我们再来看另一个例子。
【范例程序:CH03_04】
01 /*文件:CH03_04.java 02 *说明:if-else-if条件选择语句(2) 03 */ 04 05 public class CH03_04{ 06 public static void main(String[] ages){ 07 08 //变量声明 09 int score=88; 10 System.out.println("Tim学期成绩总分="+score); 11 //if-else-if条件选择语句使用范例 12 if(score>=90){ 13 System.out.println("测验得分等级:A"+'\n'); 14 }else if((score>=70)&&(score<90)){ 15 System.out.println("测验得分等级:B"+'\n'); 16 }else{ 17 System.out.println("测验得分等级:C"+'\n'); 18 } 19 20 score=60; 21 System.out.println("Tracy学期成绩总分="+score); 22 if(score>=90){ 23 System.out.println("测验得分等级:A"+'\n'); 24 }else if((score>=70)&&(score<90)){ 25 System.out.println("测验得分等级:B"+'\n'); 26 }else{ 27 System.out.println("测验得分等级:C"+'\n'); 28 } 29 } 30 }
【程序的执行结果】
程序的执行结果可参考图3-8。
图3-8
【程序的解析】
第12~18行:如果学期总成绩(score)为88分,那么换算成等级应该属于什么等级?“score>=90”为等级A、“70<=score<90”为等级B、“score<=70”为等级C。
第14、24行:对于“70<=score<90”的描述,使用AND(&&)逻辑运算符。
嵌套if语句是指“内层”的if语句是另一个“外层”if的子语句,此子语句可以是if语句、else语句或者if-else语句。
【嵌套if条件选择语句的语法】
if (条件判断表达式1) { 程序语句区块 (1); if (条件判断表达式2) { 程序语句区块 (2);} else { 程序语句区块 (3); } }
【范例程序:CH03_05】
01 /*文件:CH03_05.java 02 *说明:嵌套if语句 03 */ 04 05 public class CH03_05{ 06 public static void main(String[] ages){ 07 08 //变量声明 09 int a=0,b=0; 10 System.out.println("AND逻辑门=("+a+","+b+")"); 11 if (a==1){ 12 if (b==1){ 13 System.out.println(a+"(AND)"+b+"="+"1"+'\n'); 14 } 15 else{ 16 System.out.println(a+"(AND)"+b+"="+"0"+'\n'); 17 } 18 } 19 else{ 20 System.out.println(a+"(AND)"+b+"="+"0"+'\n'); 21 } 22 a=1; 23 System.out.println("AND逻辑门=("+a+","+b+")"); 24 if (a==1){ 25 if (b==1){ 26 System.out.println(a+"(AND)"+b+"="+"1"+'\n'); 27 } 28 else{ 29 System.out.println(a+"(AND)"+b+"="+"0"+'\n'); 30 } 31 } 32 else{ 33 System.out.println(a+"(AND)"+b+"="+"0"+'\n'); 34 } 35 a=1; 36 b=1; 37 System.out.println("AND逻辑门=("+a+","+b+")"); 38 if (a==1){ 39 if (b==1){ 40 System.out.println(a+"(AND)"+b+"="+"1"+'\n'); 41 } 42 else{ 43 System.out.println(a+"(AND)"+b+"="+"0"+'\n'); 44 } 45 } 46 else{ 47 System.out.println(a+"(AND)"+b+"="+"0"+'\n'); 48 } 49 } 50 }
【程序的执行结果】
程序的执行结果可参考图3-9。
图3-9
【程序的解析】
判断AND逻辑运算的结果。只有当参与AND逻辑运算的两个操作数同为1时,AND逻辑运算的结果才为1;其他组合的逻辑运算结果都为0。
第09~48行:若a=1且b=1,则显示结果为1,其余组合则显示结果为0。
在进行多重选择的时候,过多if-else-if条件选择语句的嵌套会造成程序维护上的困扰。在Java语言中提供了switch条件选择语句,使用它可以让程序更加简洁清楚。与if条件选择语句不同的是,switch只有一个条件判断表达式。switch是一种多选一的条件选择语句,它是按照条件判断表达式的运算结果来决定在多个程序分支中选择其中之一的程序分支,并执行这个程序分支内的程序代码。switch条件选择语句的语法如下:
switch (表达式) { case 数值1; 语句1; break; case 数值2; 语句2; break; default: 语句3; }
在switch条件选择语句中,如果找到了case后面匹配的结果值,就会执行该case程序区块内的程序语句,当执行完这个case程序区块中的程序语句之后,程序流程并不会直接离开switch语句,还会往下继续执行其他case语句与default语句,这样的情况被称为“贯穿”(Falling Through)现象。
因此,我们通常在每个case程序区块后面加上break语句来结束switch语句,这样才可以避免“贯穿”的情况。至于default语句,我们可以把它放在switch语句的任何位置,表示如果找不到任何匹配的结果值,最后就要执行default语句。此外,如果default语句摆在所有case语句的最后,就可以省略default程序区块最后的break语句,否则就必须加上break语句来结束switch语句。另外,在switch语句中的花括号绝不可省略,这是“事故多发地”(程序容易出错的地方)。
如图3-10所示是switch条件选择语句的流程图。
图3-10
假如要从期末排名给予对应的奖励,使用switch条件选择语句的语法如下:
switch (期末排名) { case 第一名: 出国旅行; break; case 第二名: 国内旅行; break; case 第三名: 购书礼券; break; default: 要多努力; }
在上述的程序代码中,若排名是第一名,则获得的奖励是“出国旅行”;若排名是第二名,则获得的奖励是“国内旅行”;若排名是第三名,则获得的奖励是“购书礼券”;但若名次不在前三名,则没有奖励。
【范例程序:CH03_06】
01 /*文件:CH03_06.java 02 *说明:switch条件选择语句 03 */ 04 05 public class CH03_06{ 06 public static void main(String[] ages){ 07 08 //变量声明 09 char math_score='A'; 10 System.out.println("Michael数学成绩:"+math_score); 11 switch(math_score){ 12 case'A': 13 System.out.println("老师评语:非常好!真是优秀!"+'\n'); 14 break; // break的作用是跳离switch条件选择语句 15 case'B': 16 System.out.println("老师评语:也不错,但还可以更好!"+'\n'); 17 break; // break的作用是跳离switch条件选择语句 18 case'C': 19 System.out.println("老师评语:真的要多用功!"+'\n'); 20 break; // break的作用是跳离switch条件选择语句 21 default: 22 System.out.println("老师评语:不要贪玩,为自己多读书!"+'\n'); 23 } 24 25 math_score='C'; 26 System.out.println("Jane数学成绩:"+math_score); 27 switch(math_score){ 28 case'A': 29 System.out.println("老师评语:非常好!真是优秀!"+'\n'); 30 break; // break的作用是跳离switch条件选择语句 31 case'B': 32 System.out.println("老师评语:也不错,但还可以更好!"+'\n'); 33 break; // break的作用是跳离switch条件选择语句 34 case'C': 35 System.out.println("老师评语:真的要多用功!"+'\n'); 36 break; // break的作用是跳离switch条件选择语句 37 default: 38 System.out.println("老师评语:不要贪玩,为自己多读书!"+'\n'); 39 } 40 } 41 }
【程序的执行结果】
程序的执行结果可参考图3-11。
图3-11
【程序的解析】
第09行:声明存储数学成绩的变量math_score,并赋初值。
第11~23行:switch语句的条件判断表达式为math_score,若math_score=A,则显示“老师评语:非常好!真是优秀!”;若math_score=B,则显示“老师评语:也不错,但还可以更好!”;若math_score=C,则显示“老师评语:真的要多用功!”;若math_score不是A或B或C,则显示“老师评语:不要贪玩,为自己多读书!”。
每一个case程序语句区块结束位置都会加上break语句,目的是说明如果已经满足该case的条件,其余的case条件就不需要再进行比较,可以离开switch语句了。
条件运算符(Conditional Operator)是一个三元运算符(Ternary Operator,或称为三目运算符),它和if else条件选择语句的功能一样,可以用来替代简单的if else条件选择语句,让程序代码看起来更为简洁,它的语法格式如下:
条件判断表达式?程序语句一:程序语句二;
如果条件判断表达式成立,就会执行程序语句一;否则执行程序语句二。不过使用条件运算符只允许单行语句,例如:
str = ( num>=0 )? "正数":"负数"
等号的右边是“条件判断表达式”,问号“?”表示if,冒号“:”表示else。因此,上面的范例说明:如果num的值大于等于0,就显示“正数”,否则显示“负数”。
【范例程序:CH03_07】
01 /*文件:CH03_07.java 02 *说明:条件运算符 03 */ 04 05 public class CH03_07{ 06 public static void main(String[] ages){ 07 08 //变量声明 09 int math_score=70; 10 System.out.println("Michael数学成绩:"+math_score); 11 String str; 12 str=(math_score>80)?"非常好!":"多加油!"; 13 System.out.println("老师评语:"+str+'\n'); 14 15 math_score=90; 16 System.out.println("Jane数学成绩:"+math_score); 17 str=(math_score>80)?"非常好!":"多加油!"; 18 System.out.println("老师评语:"+str+'\n'); 19 } 20 }
【程序的执行结果】
程序的执行结果可参考图3-12。
图3-12
【程序的解析】
第11行:声明用于存储结果的字符串变量。
第12行:意思是指:如果成绩高于80,老师的评语为“非常好!”;如果成绩低于80,老师的评语为“多加油!”。
使用条件运算符的方式可以减少程序的复杂度,但是它的条件判断功能比较简单,受到限制。