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示例流程