友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第42章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!





…………………………………………………………Page 91……………………………………………………………

下面是输出结果:  

  

i = 0  

continue inner  

i = 1  

continue inner  

i = 2  

continue  

i = 3  

break  

i = 4  

continue inner  

i = 5  

continue inner  

i = 6  

continue inner  

i = 7  

continue outer  

i = 8  

break outer  

  

如果没有break outer 语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于break 本身只 

能中断最内层的循环(对于continue 同样如此)。  

当然,若想在中断循环的同时退出方法,简单地用一个return 即可。  

下面这个例子向大家展示了带标签的break 以及continue 语句在 while 循环中的用法:  

  

//: LabeledWhile。java  

// Java's 〃labeled while〃 loop  

  

public class LabeledWhile {  

  public static void main(String'' args) {  

    int i = 0;  

    outer:  

    while(true) {  

      prt(〃Outer while loop〃);  

      while(true) {  

        i++;  

        prt(〃i = 〃 + i);  

        if(i == 1) {  

          prt(〃continue〃);  

          continue;  

        }  

        if(i == 3) {  

          prt(〃continue outer〃);  

          continue outer;  

        }  

        if(i == 5) {  

          prt(〃break〃);  

          break;  

        }  

        if(i == 7) {  

          prt(〃break outer〃);  



                                                                                           90 


…………………………………………………………Page 92……………………………………………………………

          break outer;  

        }  

      }  

    }  

  }  

  static void prt(String s) {  

    System。out。println(s);  

  }  

} ///:~  

  

同样的规则亦适用于while:  

(1) 简单的一个 continue 会退回最内层循环的开头(顶部),并继续执行。  

(2) 带有标签的 continue 会到达标签的位置,并重新进入紧接在那个标签后面的循环。  

(3) break 会中断当前循环,并移离当前标签的末尾。  

(4) 带标签的break 会中断当前循环,并移离由那个标签指示的循环的末尾。  

这个方法的输出结果是一目了然的:  

  

Outer while loop  

i = 1  

continue  

i = 2  

i = 3  

continue outer  

Outer while loop  

i = 4  

i = 5  

break  

Outer while loop  

i = 6  

i = 7  

break outer  

  

大家要记住的重点是:在Java 里唯一需要用到标签的地方就是拥有嵌套循环,而且想中断或继续多个嵌套级 

别的时候。  

在Dijkstra 的“Goto 有害”论中,他最反对的就是标签,而非 goto。随着标签在一个程序里数量的增多, 

他发现产生错误的机会也越来越多。标签和goto 使我们难于对程序作静态分析。这是由于它们在程序的执行 

流程中引入了许多“怪圈”。但幸运的是,Java 标签不会造成这方面的问题,因为它们的活动场所已被限 

死,不可通过特别的方式到处传递程序的控制权。由此也引出了一个有趣的问题:通过限制语句的能力,反 

而能使一项语言特性更加有用。  



3。2。7  开关  



 “开关”(Switch)有时也被划分为一种“选择语句”。根据一个整数表达式的值,switch语句可从一系列 

代码选出一段执行。它的格式如下:  

  

switch(整数选择因子) {  

case 整数值 1 : 语句; break;  

case 整数值 2 : 语句; break;  

case 整数值 3 : 语句; break;  

case 整数值 4 : 语句; break;  

case 整数值 5 : 语句; break;  

//。。  

default:语句;  



                                                                                           91 


…………………………………………………………Page 93……………………………………………………………

}  

  

其中,“整数选择因子”是一个特殊的表达式,能产生整数值。switch 能将整数选择因子的结果与每个整数 

值比较。若发现相符的,就执行对应的语句(简单或复合语句)。若没有发现相符的,就执行default语 

句。  

在上面的定义中,大家会注意到每个case 均以一个break 结尾。这样可使执行流程跳转至 switch主体的末 

尾。这是构建 switch 语句的一种传统方式,但break 是可选的。若省略 break,会继续执行后面的case 语 

句的代码,直到遇到一个break 为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善 

加利用。注意最后的default语句没有 break,因为执行流程已到了break 的跳转目的地。当然,如果考虑 

到编程风格方面的原因,完全可以在default 语句的末尾放置一个break,尽管它并没有任何实际的用处。  

switch语句是实现多路选择的一种易行方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择 

因子,并且必须是 int 或char 那样的整数值。例如,假若将一个字串或者浮点数作为选择因子使用,那么它 

们在 switch语句里是不会工作的。对于非整数类型,则必须使用一系列 if语句。  

下面这个例子可随机生成字母,并判断它们是元音还是辅音字母:  

  

//: VowelsAndConsonants。java  

// Demonstrates the switch statement  

  

public class VowelsAndConsonants {  

  public static void main(String'' args) {  

    for(int i = 0; i 《 100; i++) {  

      char c = (char)(Math。random() * 26 + 'a');  

      System。out。print(c + 〃: 〃);  

      switch(c) {  

      case 'a':  

      case 'e':  

      case 'i':  

      case 'o':  

      case 'u':  

                System。out。println(〃vowel〃);  

                break;  

      case 'y':  

      case 'w':  

                System。out。println(  

                  〃Sometimes a vowel〃);  

                break;  

      default:  

                System。out。println(〃consonant〃);  

      }  

    }  

  }  

} ///:~  

  

由于Math。random()会产生 0 到 1 之间的一个值,所以只需将其乘以想获得的最大随机数(对于英语字母, 

这个数字是 26),再加上一个偏移量,得到最小的随机数。  

尽管我们在这儿表面上要处理的是字符,但switch 语句实际使用的字符的整数值。在 case 语句中,用单引 

号封闭起来的字符也会产生整数值,以便我们进行比较。  

请注意 case 语句相互间是如何聚合在一起的,它们依次排列,为一部分特定的代码提供了多种匹配模式。也 

应注意将break 语句置于一个特定 case 的末尾,否则控制流程会简单地下移,并继续判断下一个条件是否相 

符。  

  

1。 具体的计算  



                                                                                          92 


…………………………………………………………Page 94……………………………………………………………

应特别留意下面这个语句:  

char c = (char)(Math。random() * 26 + 'a');  

Math。random()会产生一个 double值,所以 26 会转换成double 类型,以便执行乘法运算。这个运算也会产 

生一个 double 值。这意味着为了执行加法,必须无将'a'转换成一个 double。利用一个“造型”,double 结 

果会转换回 char。  

我们的第一个问题是,造型会对char 作什么样的处理呢?换言之,假设一个值是29。7,我们把它造型成一 

个 char,那么结果值到底是30 还是 29 呢?答案可从下面这个例子中得到:  

  

//: CastingNumbers。java  

// What happens when you cast a float or double  

// to an integral value?  

  

public class CastingNumbers {  

  public static void main(String'' args) {  

    double  

      above = 0。7;  

      below = 0。4;  

    System。out。println(〃above: 〃 + above);  

    System。out。println(〃below: 〃 + below);  

    System。out。println(  

      〃(int)above: 〃 + (int)above);  

    System。out。println(  

      〃(int)below: 〃 + (int)below);  

    System。out。println(  

      〃(char)('a' + above): 〃 +  

      (char)('a' + above));  

    System。out。println(  

      〃(char)('a' + below): 〃 +  

      (char)('a' + below));  

  }  

} ///:~  

  

输出结果如下:  

  

above: 0。7  

below: 0。4  

(int)above: 0  

(int)below: 0  

(char)('a' + above): a  

(char)('a' + below): a  

  

所以答案就是:将一个 float 或 double 值造型成整数值后,总是将小数部分“砍掉”,不作任何进位处理。  

第二个问题与Math。random()有关。它会产生0 和 1之间的值,但是否包括值'1'呢?用正统的数学语言表 

达,它到底是(0;1),'0;1',(0;1',还是'0;1)呢(方括号表示“包括”,圆括号表示“不包括”)?同样 

地,一个示范程序向我们揭示了答案:  

  

//: RandomBounds。java  

// Does Math。random() produce 0。0 and 1。0?  

  

public class RandomBounds {  

  static void usage() {  

    System。err。println(〃Usage: nt〃 +  



                                                                                           93 


…………………………………………………………Page 95……………………………………………………………

      〃RandomBounds lowernt〃 +  

      〃RandomBounds upper〃);  

    System。exit(1);  

  }  

  public static void main(String'' args) {  

    if(args。length != 1) usage();  

    if(args'0'。equals(〃lower〃)) {  

      while(Math。random() != 0。0)  

        ; // Keep trying  

      System。out。print
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!