Java流程控制语句之二

switch

switch可被归纳为一种选择语句。根据正式表达式的值(也可以被<int型的变量代替),根据表达式的值,swtich语句可以从一系列代码选出一段去执行。

switch的语法如下

switch(integral-selector){

       case integrak-value1 : statement;break;

       case integrak-value2 : statement;break;

       case integrak-value3 : statement;break;

       case integrak-value4 : statement;break;

       //….

       default:statement;

}

       integral-selector选择因子是一个能够产生整数值的表达式,switch能将这个表达式的结果与每个integral-value相比较,若发现相同的,就会执行该case后的语句,若没有相符的则会执行default后面的语句。

       其中每一个case后面均有一个break结尾,这会让语句跳转至switch的末尾,这里break是可选的,如果不写break语句会继续执行接下来的case,直到遇到break位置。最后的default后面没有加break因为这里也是switch的末尾,也可以跟default后面加break,不过没有任何意义。

public class VowelsAndConsonants{

       public static void main(String [] args){

              Random rand =new Random(47);

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

                     int c=rand.nextInt(26)+ ‘a’;

                     System.out.print((char)c+ “,” + c + “:”);

                     switch(c){

                            case ‘a’:

                            case ‘e’:

                            case ‘i’:

                            case ‘o’:

                            case ‘u’:System.out.print(“vowel”);break;

                            case ‘y’:

                            case ‘w’:System.out.print(“Sometimes a vowel”);break;

                            default: System.out.print(“consonant”);

                     }

}

}

}

输出

y,121: Sometimes a vowel

.

.

这里a为偏移量,因为随机数会产生0-26任意数字,加上a后就会偏移值小写字母中

foreach

foreach语法可以不必创建int变量去对由访问项构成的序列进行计数,foreach将自动遍历获得每一项

      

foreach语法如下

for(变量类型 x : 该变量的序列){

       statement

}

用foreach遍历float数组

public class ForEachFloat{

       public static void main(String [] args){

              Random rand = new Random(47);

              float f[] = new float[10];

              for(int i=0;i < 10;i++){

                     f[i]=rand.nextFloat();

}

for(float x : f)

       System.out.println(x);

}

}

输出

0.32454357

.

.

. //共10行

如上例所示

for(float x : f){

       这条语句定义了一个名为x的float型变量,而后将每一个值遍历到x  

}

任何数组或返回值是数组的方法都可以应用于foreach。

public class ForEachString{

       publicn static void main(String [] args){

              for(char c : “Hello Word”.toCharArray()){

                     System.out.print(c+” ”);

}

}

}

输出

H e l l o  W o r d

但foreach不能直接对不存在的一组逻辑数字进行遍历,但for却可以

例如 for(int i=0;i < 100;i++)

如果想直接对数字进行遍历需要创建int型的数组,但可以做个静态方法自动根据传入数字来建立数组

      

例如for(int i : range(10))

这种方法虽然可以使得foreach更通用,但是这种方法会降低计算机效率。

return

Java中有多个关键词表示无条件分支,他们只是表示这个分支无需任何测试即可发生。这些关键词包括return,break,continue

      

       return关键词有两个作用,一是指定一个方法返回什么值(void方法除外),二是它会导致当前的方法退出,并返回值。可使用return关键词改写if-else中的例子

       public class Return{

       static int test(int  testval,int  target){

              if(testvlal>target)

                     return 1;

              else if(testval<target)

                     return -1;

              else

                     return 0; //相等

}

public static void main(String [] args){

      

       System.out.println(test(10,5););

       System.out.println(test(5,10));

       System.out.println(test(5,5));

}

}

输出

1

-1

0

也可以省略掉else因为return后方法不再执行

       如果在返回void的方法中没有return语句,那么在该方法的结尾处会有一个隐藏的return,因此在方法中并非总是必须有一个return语句。但是,如果一个方法声明它将返回void之外的其他东西,那么必须确保每一条代码路径都将返回一个值。

break和continue

任何迭代语句的主体部分,都可以用break和continue来控制循环的流程.其中,break可以使程序强行退出,不执行循环中剩余的语句。而continue则会停止指定当前的循环,然后退回到循环的起始,开始下一次循环。

public class BreakContnue{

       public static void main(String [] args){

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

                     if(i == 74) break;

                     if(i % 9 !=0) continue;

                     System.out.print(i+” “);

}

}

System.out.println();

int i = 0;

while(true){

       i++;

       int j = i * 27;

       if(j == 1269) break;

       if(i %10 !=0) continue;

       System.out.print(i+” ”);

}

}

输出

0 9 18 27 36 45 54 63 72

10 20 30 40

在上例的for循环中i的值达到74后就会触发break;结束循环因此i的值永远没法达到100,而每当i不能被9整除时便会触发continue;因为会跳过之后的代码,即输出部分,直接进入下一次循环(i的值增加),只有能被9整除且小于74的数才会被输出。

后面的便是无限while循环因为括号内条件永远为true,但是循环中有一个break;可以控制循环结束。

还有一种无限循环的形式是for(;;)。编译器将while(true)和for(;;)看做是同一回事。所以用哪个取决于自己的习惯。

标签

在java中标签作用的地方时在迭代语句之前。在标签和迭代之前置入任何语句都是不好的。而在迭代之前设置标签的唯一理由是:我们希望潜逃另一个迭代或者一个开关。这是由于break和continue关键词通常只中断当前循环,但若随标签一起使用,他们就会中断循环,知道标签所在的地方:

标签的语法

label1:

label1:

outer-iteration{

       inner-iteration{

       //….

       break;//(1)

       //…..

       continue;//(2)

       //…..

       break label1;//(3)

       //…..

       continue label1;//(4)

       在(1)中break会中断内层循环回到外部循环,在(2)中continue回结束内层循环的本次循环回到内部循环的起始点。在(3)中,break lable1中因为break后面加了label1所以会直接中断所有循环回到标签处,但不重新进入循环,也就是说直接终止了两个循环,而(4)中continue label1则会直接中断内部与外部循环回到标签处,随后继续循环,但是从外部循环开始。

public class labeledFor{

       public static void main(String [] args){

              int i = 0;

              outer:

              for(;;){

                     inner:

                     for(;i<10;i++){

              System.out.print(“i=”+i);

              if(i == 2){

                     System.out.print(“continue”);

                     continue;

              }

              if(i == 3){

                     System.out.print(“break”);

i++;

                     break;

              }

              if(i == 7){

                     System.out.print(“continue outer”);

                     i++;

continue outer;

              }

              if(i == 8){

                     System.out.print(“breaj outer”);

                     break outer;

              }

              for(int k=0;k < 5;k++){

                     if(k==3){

                            System.out.print(“continue inner”);

                            continue inner;

}

}

}

}

}

}

输出

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会中断for循环,而且在抵达for循环末尾时,递增表达式不会执行,由于break跳过了递增表达,所以在i==3的情况下直接对i执行递增运算。在i==7的情况下,continue outer语句也会跳到循环顶部,而且也跳过递增。所以这里也对i进行了直接递增

如果没有break outer,就无法直接同时终止2个循环,如果想在终止循环的同时退出,可以使用return关键字。

posted on 2011-02-16 18:58  柠檬哥  阅读(854)  评论(0编辑  收藏  举报

导航