4.2 if语句的嵌套
在开发过程中,经常需要判断多个条件进行多分支流程,这就需要嵌套使用if条件语句。这时就涉及哪个else与哪个if配对的问题,请读者考察如下代码段。
1 int a=2; 2 int b=5; 3 if(a>3) 4 if(b<4) 5 System.out.println("1:我执行了"); 6 else 7 System.out.println("2:我执行了");
· 根据前面讲的语法规则可以将如上代码理解为“else”与第一个“if”配对。这样,由于a值为2,则执行else分支,打印“2:我执行了”。
· 当然,也可以理解为“else”与第二个“if”配对。这样,由于a值为2,将什么都不打印。
· 代码实际上什么都不打印。
实际上,为了避免歧义的产生,在Java中规定“else”总是与离其最近的“if”配对。这样,就很好地避免了歧义的产生。另外,为了提高代码的可读性,避免错误,请读者要恰当地使用代码缩进,并尽量使用花括号。例如,将上面的代码段改写为如下形式就一目了然了。
1 int a=2; 2 int b=5; 3 if(a>3) 4 { 5 if(b<4) 6 { 7 System.out.println("1:我执行了"); 8 } 9 else 10 { 11 System.out.println("2:我执行了"); 12 } 13 14 }
细心的读者可能会提出疑问,若需要测试的条件非常多,就需要嵌套很多层,这样即使恰当使用了缩进与花括号,代码可读性还是非常差。其实,在Java中还有另一种形式的写法可以方便地解决此问题,即重复地交替出现if……else if……else,其语法为:
if(表达式a) {表达式a返回值为true时执行的语句序列} else if(表达式b) {表达式a返回值为false且表达式b返回值为true时执行的语句序列} else {所有条件表达式返回值均为false时执行的语句序列}
其执行流程如图4-3所示。
图4-3 if/else if多分支流程
下面给出一个自动判断学生成绩等级的代码段,说明了这个问题。
1 if(grade>=90) 2 { 3 System.out.println("成绩优秀"); 4 } 5 else if(grade>=80) 6 { 7 System.out.println("成绩良好"); 8 } 9 else if(grade>=70) 10 { 11 System.out.println("成绩中等"); 12 } 13 else if(grade>=60) 14 { 15 System.out.println("成绩及格"); 16 } 17 else 18 { 19 System.out.println("成绩不及格"); 20 }
· grade为表示学生成绩的int型变量。
· 从以上代码可以体会,无论要嵌套多少层,代码的可读性都不会受到影响。上述代码的执行流程如图4-4所示。
图4-4 if/else if示例流程