流程控制
首先来介绍程序的流程控制。
所谓的流程控制,就是在我们前面的课程中我们已经学过了变量,数据类型,运算符,表达式,这些都是计算机编程的基本元素,但是我们程序的基本执行单元应该是语句,程序执行,执行的不是表达式,而是执行语句。就好像我们小时候先学认字儿,再学组词,但最终要学造句,因为写作文一定是一句话一句话的写。
那么计算机程序一定会有多个语句,这个语句的执行顺序就叫做流程控制,我代码中这么多语句先执行谁后执行谁,每个语句执行几遍,要不要执行要不要不执行这都叫流程控制。
顺序执行流程,我们的所有语句都放在主函数里,他一定是从主函数的第一句开始执行,然后执行第二句,第三句,直到把主函数中的每一句自上而下都执行一遍的时候,程序执行结束。比如我在主函数中写十个打印语句,他一定是一句一句的执行,这显然是计算机软件最基本的一种执行流程,顺序执行流程。
条件分支流程
而现在我们要介绍的是条件分支流程,条件分支流程也叫做分支结构,选择结构,它主要解决的是有些语句我在执行以前要先去判断一个条件,根据这个条件来决定这条语句,或者后面的某个代码块执行或者不执行。如果说以前的顺序流程是每句话执行一遍的话,条件分支结构是每句话执行0-1遍,也许条件成立会执行,条件不成立这句话就会不执行。
if语句
说到条件分支流程,最基本的语法就是一个if语句,语法结构如下。
if(布尔表达式){
代码块
}
复制代码
关键字if,If后面方一个圆括号 圆括号里写什么?必须是一个布尔表达式 不可以写整数。在C语言中布尔表达式和整数表达式是相同的,0表示假,非0值表示真,但是在java中真就是真 1就是1 真不是1 1也不是真 这是java和c的重要区别,其实也是java简单性的体现。
解释一下,例如int a = 10 int b =5
本来我要比较a和b是否相等,if(a==b) 但是我写错了,少写了一个等号,写成了if(a=b)。那么在java中一个等号是赋值表达式最后的结果是5 是会报错的,但是在C中是没有问题的,不会报错。这样的错误不能及时发现就会造成一定的问题,而实际上在C的开发中这也确实是一个问题。所以java在设计的时候就补上了这个漏洞,其结果就是在java中if后面的圆括号中只能够放布尔表达式。
后面跟一个代码块 逻辑关系是当布尔表达式为真的时候执行代码块,为假的时候不执行。所谓代码块就是一个花括号,咱们也没少见,类啊,方法啊都是一个花括号。
举个例子,用户输入一个整数,我们通过程序来判断这个整数是偶数还是奇数,如果是偶数就输出偶数到控制台,如果是奇数就什么也不输出。代码如下:
Scanner s = new Scanner(System.in);
int n = s.nextInt();
if(n%i==0){
System.out.println("偶数");
}
复制代码
这就是最基本的if语句。
if else语句
那么我们的逻辑继续变化,如果那个数字儿是偶数就打印偶数两个字儿,如果是奇数就打印奇数两个字儿。那么这时候需要第二个语法结构,if else。
if(布尔表达式){
代码块1
}else{
代码块2
}
复制代码
当布尔表达式为真的时候执行代码块1,else就是否则的意思,什么叫否则,就是当前面的那个布尔表达式为假的时候就执行else后面的代码块,这就真正是条件分支了,代码块1和代码块2怎么着都会执行一个,条件为真执行代码块1,条件为假执行代码块2。 根据这个逻辑我们对之前的代码做一定的修改,如果条件为假else后面再加一个代码块打印奇数。
Scanner s = new Scanner(System.in);
int n = s.nextInt();
if(n%i==0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
复制代码
以上就是if else结构。
if else if
下面我们看一下多重if else结构,它会有多个条件,语法结构如下
if(条件1){
代码块1
}else if(条件2){
代码块2
}else if(条件3){
代码块3
}else{
代码块4
}
复制代码
先是if条件1,当条件1成立的时候会执行代码块1,else if条件2,else代表当条件1不满足的时候,进入这个else,判断条件2,条件2成立执行对应代码块,然后执行结束。如果进入第三个条件,说明前两个条件都不满足,这时候再来判断条件3,如果不满足条件3,就会到最后一个else中,最后一个可以加if也可以不加,实际上就是前面所有的条件都不满足就会到最后的else代码块中。
根据这个语法逻辑举个例子,加入输入的整数是月份,根据输入的整数判断是那个季节,1-3是春节,4-6是夏季,依次。
Scanner s = new Scanner(System.in);
int n = s.nextInt();
if(n<=3){
System.out.println("春天");
}else if(n<=6){
System.out.println("夏天");
}else if(n<=9){
System.out.println("秋天");
}else{
System.out.println("冬天");
}
复制代码
以上是关于if语句所有的语法结构,额外的再说一点,if语句可以根据实际的需要进行嵌套,至于嵌套的层数没有限制。
条件本质
所有的java代码在执行的时候最后都会被程序最终都是一条条的指令,CPU有一个指令指示器,指向下一条要执行的指令,CPU根据指示器的指示加载指令并且执行。指令大部分是具体的操作和运算,在执行这些操作时,执行完一个操作后,指令指示器会自动指向挨着的下一个指令。
而有一种特殊的指令,称为跳转指令,这些指令会修改指令指示器的值,让CPU跳到一个指定的地方执行。跳转有两种,一种是条件跳转,另一种是无条件跳转。条件跳转检查某个条件,满足则进行跳转,无条件跳转则是直接进行跳转。条件分支流程在执行的时候,if, else实际上都会转换为这些跳转指令。
下节预告:switch选择结构,为什么switch后面的括号中只能够填如byte,int等类型?
我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。
永远相信美好的事情即将发生。