Minecraft(我的世界)中文论坛
标题: 【万年坑】【该章完结】Java高手训练营第三章:流程控制
作者: ufof 时间: 2015-9-3 11:11
标题: 【万年坑】【该章完结】Java高手训练营第三章:流程控制
本帖最后由 ufof 于 2015-12-8 05:53 编辑
3.1 if和else
3.1.1 分支语句概述
一般来说,再编程当中,有三种基本结构:分别为顺序结构、分支结构,以及循环结构。顺序结构最容易理解的:先执行第一句话,然后执行下一句话。

这一章,我们会介绍分支结构和循环结构。分支结构最基本的控制方法就是if和else语句。
3.1.2 语法
单个if的用法如下所示:
流程图如下:

if和else共同使用的用法如下所示:
- if(布尔类型){
- //需要执行的语句
- }
- else{
- //不然执行的语句
- }
复制代码
流程图如下:

if、else if的用法如下所示:
- if(布尔类型){
- //需要执行的语句
- }
- else if(布尔类型){
- //需要执行的语句
- }
- else if(布尔类型){
- //需要执行的语句
- }
- ....若干个else if
- else{
- //如果上面的布尔都不满足,执行这里面的语句
- }
复制代码
最后的else可有可不有。
流程图:

3.1.3 实例
写一个程序,需求判断一个数字是否为正数:
- class IfDemo{
- public static void main(String[] args){
- int num = 10;
- if(num>0){
- System.out.println("该数字为正数");
- }
- else{
- System.out.println("该数字为负数或0");
- }
- }
- }
复制代码 结果:

在这个小程序中,使用了if和else判断语句,对int类型变量num判断num是否>10。由于比较运算符返回的是一个布尔,所以其可以直接放在if后面的括号中。
再写一个程序,要求判断成绩的等级:
- class IfDemo{
- public static void main(String[] agrs){
- int score = 85;
- if(score==100){
- System.out.println("A+");
- }
- else if(score>90){
- System.out.println("A");
- }
- else if(score>80){
- System.out.println("B");
- }
- else if(score>70){
- System.out.println("C");
- }
- else if(score>60){
- System.out.println("D");
- }
- else{
- System.out.println("不及格");
- }
- }
- }
复制代码 结果:

这个程序使用了大量的else if语句。这个程序显得有一些臃肿和笨重。因此Java为我们提供了一种更好的分支结构语句,switch。我们下一章会讲到。
本章小结
- 编程一共有三个结构:顺序结构、分支结构和循环结构
- if可以单独使用,可以和else配合,也可以和else if配合使用
3.2 switch多分支语句
3.2.1 switch概述
在上一章的最后一个例子当中,我们用了大量的else if语句来对值得大小进行判断来进行输出。这种写法过得去,但是显得臃肿。因此,Java 7的更新当中,推出了一种新的多分支语句,叫做switch。
3.2.2 switch语法
switch的语法如下所示:
- switch (需要判断的变量){
- case 值:
- //执行语句
- break;
- case 值:
- //执行语句
- break;
- //....若干个case
- default:
- //如果哪个值都不是执行的语句
- }
复制代码 switch中的值只可以是任意整数类型、char、字符串、以及枚举类型。
程序需求:输入数字,判断是一个星期里的哪天:
- class SwitchDemo{
- public static void main(String[] args){
- int week = 6;
-
- switch (week){
- case 7:
- System.out.println("星期天");
- break;
- case 1:
- System.out.println("星期一");
- break;
- case 2:
- System.out.println("星期二");
- break;
- case 3:
- System.out.println("星期三");
- break;
- case 4:
- System.out.println("星期四");
- break;
- case 5:
- System.out.println("星期五");
- break;
- case 6:
- System.out.println("星期六");
- break;
- default:
- System.out.println("请输入1~7之间的数字");
- }
- }
- }
复制代码 结果:

ps:break这个关键字是指从判断语句中跳出。
本章小结
- switch是Java 7中新推出的一个多分支语句
- switch用于对一个变量的不同的值执行不同的语句
- 如果所有case都不满足,执行default下的语句
3.3 三目运算符
3.3.1 三目运算符概述
三目运算符是唯一一个有三个操作数的运算符。三目运算符用于先判断一个逻辑表达式是否为真,如果为真返回一个值;如果为假返回另外一个值。
三目运算符是一个运算符,所以一般需要赋给另外一个变量。
3.3.2 语法和应用
三目运算符语法如下:
流程图如下:

若为真返回的值以及若为假返回的值可以是一个字面量,也可以是一个运算。
编写一个程序,要求输入两个数,要用大的数减去小的数。
- class TernaryOperator{
- public static void main(String[] args){
- int num1 = 4;
- int num2 = 7;
-
- int result = num1>num2?num1-num2:num2-num1;
- /*
- 这个三目运算符的意义:
- 如果num1大于num2,返回num1-num2。
- 如果num1不大于num2,返回num2-num1(相反)。
- */
- System.out.println("result="+result);
- }
- }
复制代码 结果:

在这个程序中的第六行,通过三目运算符先判断num1是否大于num2。在这个例子当中num1>num2为假,所以返回第二个值,也就是num2-num1。
本章小结
- 三目运算符是Java中唯一使用三个操作数的运算符
- 三目运算符先判断问号前的逻辑表达式,如果为真,返回第一个值;若为假返回第二个值
- 两个值必须为字面量或一个运算
3.4 while和do while
3.4.1 循环结构概述
我们已经学习了顺序结构和分支结构。现在我们再来学最后一种结构:循环结构。
顾名思义,循环结构就是不断重复某一个动作,直到某一个条件被满足。Java为我们提供了while、for这两个循环语句。我们就先来学习while吧。
3.4.2 语法
while的语法如下:
do while的语句如下:
- do{
- //循环的语句
- }
- while(逻辑表达式);
复制代码
while的流程图如下:

简单来说,就是先判断是否满足逻辑表达式,然后执行语句。执行完之后再次来判断,直到不满足为止。
do while的流程图:

while和do while最大的区别就在于先判断还是先执行。while是先判断;而do while是先执行。
3.4.3 应用
编写一个程序,要求对这个数字自增十次,每自增一次打印一次自己的值。
- class WhileDemo{
- public static void main(String[] agrs){
- int count = 0;
- while(count<10){
- count++;
- System.out.println("count="+count);
- }
- }
- }
复制代码 结果:

在这个小程序中,首先定义了一个叫做count的int,赋值0。在其小于10的情况下,一直自增并打印,所以就有了现在的结果。
不过大家一定要注意,一定要使循环可以结束,也就是说一定要对while后面的逻辑表达式中涉及到的变量进行改动。如果永远都能满足外面的表达式,那么就是一个死循环。
本章小结:
- while和do while是一个循环语句
- while先判断、do while先执行
- 一定要让循环可以跳出
3.5 for
3.5.1 for循环概述
for循环是Java中最常用、最有用的循环。在上一章我们学习while循环的时候,对变量的初始化以及自增/自减都是手动完成的。for可以把初始化、循环判断、对变量的操作融为一体。所以说for循环更加简洁明了。
3.5.2 for语法
for的语法如下所示:
- for(表达式1;表达式2表达式3){
- //循环执行的语句
- }
复制代码
表达式1用于声明一个变量并且赋值;表达式2是判断语句,是是否继续循环的依据,一般是在表达式1中声明的变量的比较运算;表达式3一般是对变量进行自增或自减的运算。
流程图如下:

我们引用上一章讲while的程序。就是初始化一个变量并赋值为0,在其小于10的情况下一直自增并打印。
- class ForDemo{
- public static void main(String[] agrs){
- for(int count = 0;count<=10;count++){
- System.out.println("count="+count);
- }
- }
- }
复制代码 结果:

对于变量的声明和赋值、自增都已经在for中定义好了。这样的循环很容易使人明白。所以说for为什么如此常见。
本章小结
- for是Java中最常用的循环语句
- for中有三个表达式
- 第一个表达式负责变量的初始化;第二个表达式负责循环的条件;第三个表达式负责对变量进行运算
3.6 break和continue
3.6.1 break、continue概述
假如说吃饭是一个循环结构,循环体是往嘴里放东西,判断条件是还有没有饭。不过现在我们遇到一个问题,我在饭吃完之前就已经饱了,如果再继续吃的话会吐。这里就涉及到在循环结束之前终止循环的问题。Java为我们提供break来强制跳出循环。
break是跳出整个循环。continue用于跳过本次循环,直接进入下一次循环。相信这不难理解。
3.6.2 具体实现方法
break和continue十分容易用。就是直接“break;”或者“continue;”。要注意这两个关键字一定要在循环体中使用。
- class BreakDemo{
- public static void main(String[] args){
- for(int num = 0;num<10;num++){ //循环
- System.out.println("num="+num);
- if(num==7){ //如果num等于7
- break; //跳出整个循环
- }
- }
- }
- }
复制代码 结果:

在这个for循环当中,我嵌套了一个判断语句。如果num==7的话,跳出循环。从结果可以看出来,的确num为7时循环已经结束。
学生提问:我在循环体中嵌套了另一个循环体。在内部的循环体中break,会跳出两个循环体还是内部的循环体?
答:仅跳出内部循环体。
学生提问:那么我想要跳过特定的循环体怎么办?
答:可以对外部的循环体取一个标签,标签必须是一个标识符。break后面要紧跟着标签名。
- class LoopLabelDemo{
- public static void main(String[] agrs){
- outer: //定义标签
- for(int x = 0;x<10;x++){
- for(int y = 0;y<10;y++){
- if(y==5){
- break outer; //在break之后紧跟着标签名
- }
- System.out.println("Inner.."+y);
- }
- }
- }
- }
复制代码 结果:

在这个程序中,仅打印了5次便终止了。这是因为在内部循环体循环5次之前,还没有满足y==5,。满足了之后,把外部的循环给终止了,所以仅仅打印了5次。
再来演示一下continue:
- class ContinueDemo{
- public static void main(String[] agrs){
- for(int num = 0;num<10;num++){
- if(num%2==0){
- continue;
- }
- System.out.println("num="+num);
- }
- }
- }
复制代码 结果:

可以发现,打印的数字都是奇数。这是因为我在循环体中加入了一个判断语句,如果num取2的余数为0,也就是如果num为偶数,continue跳过本次循环。所以打印出来的数都是奇数。
本章小结:
- break用于跳出整个循环;continue用于跳出本次循环
- 可以对循环体加上标签,通过break (标签名);跳出对应标签的循环
3.7 无限循环
3.7.1 无限循环概述
Java并没有为我们提供专门的无限循环的循环结构。但是我们可以通过对之前的while和for进行一些小小的改动来实现无限循环。
无限循环照样可以被break和continue。
3.7.2 通过while实现
while是否接着循环取决于是否满足他的逻辑表达式。如果我们就给他写一个字面量true,每一次循环都可以满足这个条件,自然就是无限循环。
- class InfiniteLoopDemo{
- public static void main(String[] args){
- while(true){
- //一些语句
- }
- }
- }
复制代码 每一次循环来判断是否满足条件,都是true,自然就是无限循环的。
3.7.3 通过for来实现
for中的第二个表达式就是是否接着循环的判据。可以像上面一样,也写一个字面量true,也可以实现无限循环。
还有另一种方法,第二个表达式可以什么都不写(但是分号得要有):
- class InfiniteLoopDemo{
- public static void main(String[] args){
- for(int x=0;;x++){
- //一些语句
- }
- }
- }
复制代码
甚至另外两个表达式也可以什么都不写:
- class InfiniteLoopDemo{
- public static void main(String[] args){
- for(;;){
- //一些语句
- }
- }
- }
复制代码
都可以实现无限循环。
本章小结:
- Java没有为我们提供专门的无限循环循环结构,但是可以通过对while和for的小小的变动来实现
- 无限循环照样可以被break和continue
- while后面的表达式若为字面量true,无限循环
- for第二个表达式若为true,或什么都没有,无限循环
[groupid=546]Command Block Logic[/groupid]
作者: Neubulaeko 时间: 2015-9-11 12:26
OMG I was scared
刚刚看只有3.4
现在有3.1了
OMG
作者: 柠檬小笨蛋 时间: 2015-10-1 15:04
懒到死的我用E语言的时候也用了一大堆判断如果
作者: 柠檬小笨蛋 时间: 2015-10-2 17:42
报告!发现一个小错误:
如果永远也能满足外面的表达式,那么就是一个死循环。
应该是
如果永远都能满足外面的表达式,那么就是一个死循环。
吧?好听一点
作者: glldc 时间: 2015-12-13 10:28
为什么我只看到3.1{:10_499:}
作者: ufof 时间: 2015-12-13 11:06
我已经在索引贴中反复强调:
每一章都会有一个目录,已经有许多人因为不会使用目录读不到完整的教程,因此强调,目录可以戳!目录可以戳!目录可以戳!。
作者: 2478003816 时间: 2016-2-1 10:21
对编程一窍不通的我看到这居然有一点小懂..{:10_492:} 支持
作者: 52d52d 时间: 2016-4-29 11:11
最后一个判断成绩等级的最后一个else好像不对劲啊
60分也应该算是及格吧
作者: craftor 时间: 2016-5-5 20:30
3.5.2代码少了个;
作者: HackerXuanxu 时间: 2016-5-21 17:26
本帖最后由 HackerXuanxu 于 2016-5-21 17:32 编辑
吐槽一句,图全挂......
不过教程写得很好,
表示看得很懂,
话说标签是紧接循环吗?
作者: Innovators 时间: 2016-6-3 19:12
图都崩了,请求补
作者: glldc 时间: 2016-6-10 11:10
谢谢。{:10_492:}
作者: 花生米123456 时间: 2016-6-10 11:26
求补一下图
作者: ufof 时间: 2016-6-10 19:40
本人已经知道了挂图的问题,不过学业要紧,我计划暑假开始补。
作者: ErieStary 时间: 2016-6-17 21:41
强烈要求能不能把图重新补一下,很多图都损坏了...我这个新手光看文字摸瞎学有点吃力啊...
作者: ufof 时间: 2016-6-17 22:33
本人学业真的要紧,最早也两个星期开始修复吧。。十分抱歉{:10_503:}
作者: WorldWonder 时间: 2016-8-25 08:48
不过辅以教程还是很好的办法
毕竟书得读很多遍才会懂【至少我这么读】
作者: 寒枫★Da_Da 时间: 2016-8-25 08:51
图片死的太多了
作者: WorldWonder 时间: 2016-8-25 08:52
不得不说那个吃饭的比喻...233333333【笑出声】
教程很简明易懂,但是还是比较推荐自己买一本书来看w
内容要详细很多吧
作者: Exel 时间: 2016-11-6 13:13
很轻真很清真
作者: MCJMNM 时间: 2016-11-6 18:58
楼主,您图床崩了。。。。。。
作者: Absolutefield 时间: 2016-11-16 13:30
楼主,图全挂了
作者: ufof 时间: 2016-11-16 20:31
本人实在无时间一一修补,请你在索引贴上下载PDF版本吧。
作者: Absolutefield 时间: 2016-11-16 21:56
教程可确实是好教程,但是就是有些不方便·····
作者: 2005014 时间: 2016-12-5 23:26
建议补图后,在图后面添加图片链接。
作者: pangdundun 时间: 2017-2-12 00:28
请问三目运算符中的“?”与键盘上的“?”是一样的吗?看起来并不一样哦~
作者: pangdundun 时间: 2017-2-12 09:53
在for中嵌套一个for。请问在内循环for中int了一个变量,这个变量可以在外循环中令其打印出来吗?
我刚刚试了下,在外循环命令打印内循环的变量a,结果输出找不到符号。
△请问在for(int a = 0;;)中定义的a。不是全局变量吗?
作者: W3106388458 时间: 2017-3-26 14:06
我竟然看懂了
作者: 想好好是好 时间: 2017-8-11 22:20
图挂了亲????????费心了。
作者: WaterC 时间: 2018-8-29 18:36
图全挂了啊.......怎么回事
作者: 密斯i 时间: 2018-10-14 23:22
我有很认真的看完了然后就是自己去实践练习
作者: enderbracket 时间: 2019-2-4 10:04
第一个代码少了一个分号
作者: 粽粽糯 时间: 2019-3-19 15:48
图片没了
作者: 名为123的貘 时间: 2019-8-15 22:18
for(表达式1;表达式2表达式3)
漏了一个分号
作者: 宇宙小白羊 时间: 2020-5-3 13:46
为什么我看不到流程图和结果