流程控制
首先来介绍程序的流程控制.
所谓的流程控制, 就是在我们前面的课程中我们已经学过了变量, 数据类型, 运算符, 表达式, 这些都是计算机编程的基本元素, 但是我们程序的基本执行单元应该是语句, 程序执行, 执行的不是表达式, 而是执行语句. 就好像我们小时候先学认字儿, 再学组词, 但最终要学造句, 因为写作文一定是一句话一句话的写.
那么计算机程序一定会有多个语句, 这个语句的执行顺序就叫做流程控制, 我代码中这么多语句先执行谁后执行谁, 每个语句执行几遍, 要不要执行要不要不执行这都叫流程控制.
顺序执行流程, 我们的所有语句都放在主函数里, 他一定是从主函数的第一句开始执行, 然后执行第二句, 第三句, 直到把主函数中的每一句自上而下都执行一遍的时候, 程序执行结束. 比如我在主函数中写十个打印语句, 他一定是一句一句的执行, 这显然是计算机软件最基本的一种执行流程, 顺序执行流程.
条件分支流程
而现在我们要介绍的是条件分支流程, 条件分支流程也叫做分支结构, 选择结构, 它主要解决的是有些语句我在执行以前要先去判断一个条件, 根据这个条件来决定这条语句, 或者后面的某个代码块执行或者不执行. 如果说以前的顺序流程是每句话执行一遍的话, 条件分支结构是每句话执行 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