转载

Java杂记3—流程控制之条件

首先来介绍程序的流程控制。

所谓的流程控制,就是在我们前面的课程中我们已经学过了变量,数据类型,运算符,表达式,这些都是计算机编程的基本元素,但是我们程序的基本执行单元应该是语句,程序执行,执行的不是表达式,而是执行语句。就好像我们小时候先学认字儿,再学组词,但最终要学造句,因为写作文一定是一句话一句话的写。

那么计算机程序一定会有多个语句,这个语句的执行顺序就叫做流程控制,我代码中这么多语句先执行谁后执行谁,每个语句执行几遍,要不要执行要不要不执行这都叫流程控制。

顺序执行流程,我们的所有语句都放在主函数里,他一定是从主函数的第一句开始执行,然后执行第二句,第三句,直到把主函数中的每一句自上而下都执行一遍的时候,程序执行结束。比如我在主函数中写十个打印语句,他一定是一句一句的执行,这显然是计算机软件最基本的一种执行流程,顺序执行流程。

条件分支流程

而现在我们要介绍的是条件分支流程,条件分支流程也叫做分支结构,选择结构,它主要解决的是有些语句我在执行以前要先去判断一个条件,根据这个条件来决定这条语句,或者后面的某个代码块执行或者不执行。如果说以前的顺序流程是每句话执行一遍的话,条件分支结构是每句话执行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等类型?

我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。

永远相信美好的事情即将发生。

原文  https://juejin.im/post/5ae594eb6fb9a07aa43bfa14
正文到此结束
Loading...