条件执行

条件执行

顺序结构

代码从上到下从左到右依次执行

分支结构

判断结构

第一种形式:
if(逻辑值){
    代码块...
}
第二种形式:
if(逻辑值){
    代码块...
}else{
    代码块...
}
第三种形式;
if(逻辑值){
    代码块...
}else if(逻辑值){
    代码块...
}//可以有零个或多个else if语句
else{//最后的else也可以省略
    代码块...
}

逻辑值为true执行代码块

选择结构

    switch(选中的项){
        case 选项1:代码块;break;
        case 选项2:代码块;break;
        ...
        default:代码块;break;
    }

选项的值只能是byte、short、cahr、int四种类型,java1.7开始支持String类型和枚举类型
如果case之后没有break,那么从匹配的case开始依次往下执行.
如果每个case都有break,case之间的顺序不影响最后的结果.

实现原理

程序最终都是一条条的指令,CPU有一个指令指示器,指向下一条要执行的指令,CPU根据指示器的指示加载指令并且执行。指令大部分是具体的操作和运算,在执行这些操作时,执行完一一个操作后,指令指示器会自动指向挨着的下一条指令。
但有一些特殊的指令,称为跳转指令,这些指令会修改指令指示器的值,让CPU跳到一个指定的地方执行。跳转有两种:一种是条件跳转;另一种是无条件跳转。条件跳转检查某个条件,满足则进行跳转,无条件跳转则是直接进行跳转。
if/else实际上会转换为这些跳转指令,比如下面的代码:

int a=10;
if(a%2==0)
{
    System. out. println("偶数");
}
//其他代码

转换到的转移指令可能是:

int a=10;
条件跳转:如果a%2==0 ,跳转到第4行
无条件跳转:跳转到第7行
{
    System. out. println("偶数");
}
//其他代码
或
int a=10 ;
条件跳转:如果a%2!=0, 跳转到第14行
{
    System. out. pr intln("偶数" );
}
//其他代码

具体怎么转换和编译器的实现有关。在单一if的情况下可能不用无条件跳转指令,但稍微复杂一些的情况都需要。if、if/else、三元运算符都会转换为条件跳转和无条件跳转,但switch不太一样。
switch的转换和具体系统实现有关。如果分支比较少,可能会转换为跳转指令。如果分支比较多,使用条件跳转会进行很多次的比较运算,效率比较低,可能会使用一“种更为高效的方式,叫跳转表。跳转表是一个映射表,存储了可能的值以及要跳转到的地址,如下表所示:

条件值 跳转地址
值1 代码块1的地址
... ...
值n 代码块n的地址

跳转表为什么会更为高效呢?因为其中的值必须为整数,且按大小顺序排序。按大小排序的整数可以使用高效的二分查找。如果值是连续的,则跳转表还会进行特殊优化,优化为一个数组,连找都不用找了,值就是数组的下标索引,直接根据值就可以找到跳转的地址。即使值不是连续的,但数字比较密集,差的不多,编译器也可能会优化为一个数组型的跳转表,没有的值指向default分支。
程序源代码中的case值排列不要求是排序的,编译器会自动排序。之前说switch值的类型可以是byte、short、 int、 char、枚举和String。其中byte/short/int本来就是整数,char本质上也是整数,而枚举类型也有对应的整数,String用于switch时也会转换为整数。不可以使用long,为什么呢?跳转表值的存储空间一般为32位,容纳不下long。简单说明下String,String是通过hashCode方法转换为整数的,但不同String的hashCode可能相同,跳转后会再次根据String的内容进行比较判断。

循环结构

三个条件:循环变量,循环条件,迭代语句
    定义循环变量
    while(判断循环变量){
        代码块;
    }

练习

  • 从控制台输入一个数,求1到这个数的和
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int sum=0;
while(a>0){
    sum+=a;
    a--;
    }
System.out.println(sum);
  • 输出500以内8的倍数
int b=1;
while(b<=500){
    if (b%8==0) {
        System.out.println(b+"  ");
    }
    b++;
}
  • 输入一个数字输出这个数字是几位数
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int index=0;
while(a!=0){
    index++;
    a/=10;
}
System.out.println(index);
  • 输入一个数字,输出各位数字之和
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int sum=0;
while(a!=0){
    sum+=(a%10);
    a/=10;
    }
System.out.println(sum);

猜你喜欢

转载自www.cnblogs.com/ninety/p/9856515.html