Java-条件和循环

开始

学习完上一章,你应该了解了Java中的一部分数据类型,以及知道了如何操作它们。那么这一章节我们来学习如何更进阶地操作数据。

**↑不来一首BGM吗?**

本章要求

  • 学会使用条件分支语句
  • 学会使用循环语句

语句块

在Java中使用“{”和“}”包围起来的就是一段语句块,上面已经讲到过这个语句块里面声明的变量不能在语句块外面使用。

if语句

if语句很容易,就是如果的意思,如果某个表达式成立,则执行下面跟着的一条语句或者一段语句块。

1
2
if(表达式)
代码;

表达式是上一章教的内容,如 a<10 以及 true||false 之类的。
if语句只接受返回boolean类型(即只接受返回true或false)的表达式。
这里如果表达式成立,则执行下面的代码,如果表达式不成立,则不执行。例如:

1
2
3
4
int a = 10;
if(a < 0)
a = -a;
System.out.println(a);

他并不会执行a=-a;,因为a并不小于0。然后输出a的值为10。
如果if后面跟的是一段语句块,则它会执行后面的这一段语句块。

1
2
3
4
5
6
int a = -10;
if(a < 0) {
a = -a;
System.out.println("a小于0!");
}
System.out.println(a);

此时三条文本都会输出。
但若你将a初始化为10,则只会输出a的值为10。if后面的语句块内的所有语句都不执行!

else if

else if也很简单,他必须套在if后面,用于判断多条件分支

1
2
3
4
5
6
7
8
9
10
11
12
13
int a = -10;
if(a < 0) {
a = -a;
System.out.println("a小于0!");
}
else if(a == 0) {
a = 100;
System.out.println("a等于0!");
}
else if(a > 0) {
System.out.println("a大于0!");
}
System.out.println(a);

这段代码,会先判断a是否小于0,如果小于0,则输出“a小于0!”,然后跳过下面所有的else if,输出a的值。
如果a不小于0,则继续往下走,走到else if(a == 0),继续判断a是否等于0,如果等于0,则执行“a = 100”输出“a等于0!”,然后跳过下面所有的else if,输出a的值。
如果a不小于0,也不等于0,则继续判断a是否大于0,是则输出“a大于0”,然后输出a的值。
同if一样,如果else if后面只带一条语句,我们可以不必用“{”和“}”把它括起来。

else

else的意思很容易理解:否则。
它用于最后使用,代表一个if的结束:
如果一个if判断不成立,并且下面所有的else if判断也不成立,则执行else下的代码块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int a = -10;
if(a < 0) {
a = -a;
System.out.println("a小于0!");
}
else if(a == 0) {
a = 100;
System.out.println("a等于0!");
}
else if(a < 10) {
System.out.println("a大于0小于10!");
}
else if(a < 20) {
System.out.println("a大于0小于20!");
}
else if (a == 20) {
System.out.println("a等于20!");
}
else {
System.out.println("a大于20!");
}
System.out.println(a);

应该不难理解,这是一个简单的判断数字大小的程序。

double数据

在判断double型数据时,你不应该直接用“==”来判断。
因为double在执行了过多的计算时可能会有些误差,下面介绍一个例子:

1
2
3
4
double a;
a = 100.1;
a = a+0.1;
System.out.println(a);

控制台输出的不是100.2,而是100.19999999999999!
现在你也许知道了我为什么让你不要直接用“==”来判断,因为这时如果你直接写
if(a == 100.2)是不行的!
那如果我们必须判断这两个数值是否相等怎么办?相减!
if((a-100.2) <= 0.0000000001 )
这样子写就行了!

编码规范

不知道为什么,有些人喜欢这样子写:

1
2
3
4
5
6
if(a < 0)
a = -a;
else if(a == 0)
a = 100;
else
a = a + 100;

上面说过,if、else if、else后面可以带一个语句或语句块,后面只带一条语句时这样写确实没错,但是我并不推荐这样做。
不管后面是不是只带一条语句,一律套上一个语句块,至少看起来舒服点。
如果你打死也不想多写一个“{”和“}”,那么你可以这样做:

1
2
3
if(a < 0)a = -a;
else if(a == 0) a = 100;
else a = a + 100;

第二点就是,有些人在if和else if表达式内容冲突是,不喜欢写else if(比如说我),而是直接一路if下去,像这样:

1
2
3
4
5
6
7
8
9
if(a < 0) {
a = -a;
}
if(a == 0) {
a = 100;
}
if(a > 0) {
a = a + 100;
}

我十分不推荐这样子写!因为它在判断了第一个a是否小于零之后,还会继续判断a是否等于0。
而如果你下面两个用的else if,则不会继续往下判断了,cpu就少运算两次,对我们的代码起到了一定的优化作用。
(但我不是让你们任何情况下都用else if,具体问题具体分析)

switch语句

switch语句用于判断多值,他不像if那样只能判断true和false,他能判断很多内容:int、double、字符串…

1
2
3
4
5
6
7
8
9
switch (表达式){
case1 : 语句1
break;
case2 : 语句2
break;
...
default : 语句n
break;
}

switch语句接受一个表达式,然后下面的case接受一个值,switch会先算出这个表达式的值,然后判断与下面哪一个case值相等,相等则执行对应下面的语句,而如果它不和任何一个case相等,则执行default语句。如果程序猿没有写default,则什么都不做。
下面用一个简单的例子来介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int a = 7;
switch (a) {
case 1:
System.out.println("今天星期1!");
break;
case 2:
System.out.println("今天星期2!");
break;
case 3:
System.out.println("今天星期3!");
break;
case 4:
System.out.println("今天星期4!");
break;
case 5:
System.out.println("今天星期5!");
break;
case 6:
System.out.println("今天星期6!");
break;
case 7:
System.out.println("今天星期7!");
break;
default:
System.out.println("程序出错!");
break;
}

这段代码会根据a的大小输出今天是星期几,如果a不等于1~7中的任何一个数,则输出“程序出错!”。

while循环

while循环会一直执行后面带着的语句或语句块的代码,直到它判断的条件不成立为止:

1
2
3
while(表达式) {
执行代码;
}

用一个例子来说话:输出1~10000之间的所有整数数字

1
2
3
4
5
int a = 1;
while(a <= 10000) {
System.out.println(a);
a++;
}

(你要是不嫌累,也可写一万条System.out.println("整数");
程序会先判断a是否小于或等于10000,如果成立则执行下面的代码:当a为1时,a小于10000,执行代码输出a的值,然后让a自增1。此时a为2,仍然小于10000,继续执行……当a等于10000时,它等于10000,对于表达式a<=10000仍然成立,于是继续输出a的值,然后a自增1。此时a为10001,表达式a<=10000不成立,于是不再执行语句块内的代码。
这段代码也可以简写成:

1
2
int a = 1;
while(a <= 10000) System.out.println(a++);

do while循环

do while语句就是先把语句块里的内容执行一遍,然后再判断是否需要循环。
而while则是先判断表达式是否成立再执行,两个循环代码有区别,这里不介绍do while的例子了,直接给写法:

1
2
3
do {
执行代码;
} while (表达式);

for循环

for循环和while循环差不多,它一般用于遍历数组之类的东西(数组之后会讲到)
他的代码如下:

1
2
3
for(语句1;表达式;语句2) {
执行代码;
}

语句1在第一次执行语句块之前会先执行一次,而且它仅会执行一次。
表达式用于判断循环是否需要继续,和while里的判断差不多。
语句2在每次执行完语句块之后会执行一次。
用for循环写一个输出1~10000的整数的方法如下:

1
2
3
for(int a=1;a<=10000;a++) {
System.out.println(a);
}

当然你也可以简写成

1
for(int a=1;a<=10000;a++)	System.out.println(a);

虽然我并不推荐第二种写法就是了。

死循环

死循环就是无限执行的循环,while版如下写:

1
2
3
while(true) {
执行代码;
}

for版如下写:

1
2
3
for(;;) {
执行代码;
}

如果你的程序出现了死循环,那么它将可能卡在某一段代码一直过不去(除非你使用了多线程技术),有时候我们需要判断我们的表达式是否是“永久不变的”,如我们在输出1~10000中,如果不写a++;,则程序会无限输出1,陷入死循环。
死循环一般需要使用break语句跳出,下面会讲到。

continue语句

continue语句用于循环中,它的作用是跳过当前语句块,不执行下面的所有代码,或者说直接跳到代码块最后。
例子:输出1~10000之间的所有整数,除了可以被10整除的数。

while版

1
2
3
4
5
6
7
8
9
int a = 1;
while(a<=10000) {
if(a % 10 == 0) {
a++;
continue;
}
System.out.println(a);
a++;
}

使用了continue之后,不会执行下面的语句了,而是直接继续下一次循环。
(其实你可以写成如下,但是这里为了介绍continue的作用选择了一种更麻烦的写法)

1
2
3
4
5
6
7
int a = 1;
while(a<=10000) {
if(a % 10 != 0) {
System.out.println(a);
}
a++;
}

do while版

1
2
3
4
5
6
7
int a = 1;
do {
if(a % 10 != 0) {
System.out.println(a);
}
a++;
} while (a<=10000);

for版

1
2
3
4
5
6
for(int a=1;a<=10000;a++) {
if(a % 10 == 0) {
continue;
}
System.out.println(a);
}

break语句

switch

下面我们来试试把上面switch例子中的break语句都去掉,并将a改为3试试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int a = 3;
switch (a) {
case 1:
System.out.println("今天星期1!");
case 2:
System.out.println("今天星期2!");
case 3:
System.out.println("今天星期3!");
case 4:
System.out.println("今天星期4!");
case 5:
System.out.println("今天星期5!");
case 6:
System.out.println("今天星期6!");
case 7:
System.out.println("今天星期7!");
default:
System.out.println("程序出错!");
}

程序输出如下:

1
2
3
4
5
6
今天星期3!
今天星期4!
今天星期5!
今天星期6!
今天星期7!
程序出错!

结果是:程序除了输出case 3:还把case: 4~7里的内容都输出了,甚至default都不放过。那因为我们删掉了break语句!
break语句用于中断一个switch或者循环语句块,他中断当前所在的“{”和“}”包围起来的语句块,上面我们写了break语句的switch之所以不会输出下面的语句,就是因为break中断了switch带着的语句块,直接跳出了这段语句块!
这就是break语句的作用:中断当前语句块!(前提是这个语句块属于循环或switch)

循环

循环中的break和continue有点像,但他们完全不相同!continue是直接跳过当前循环进行下一次循环,而break是直接终止当前循环,如果我们在输出1~10000的语句中写了一句if(a == 2333) break;,则循环会在a为2333时中断,后面的数字不再输出!循环关闭!死循环必须使用它来跳出!

练习

  • 声明两个int型数据,并判断他们的大小,输出对应大小关系

  • 声明两个double型数据,并判断他们是否相等,是则输出Yes

  • 用循环输出-10086~10086间的所有整数

  • 写一个死循环输出100000个1,并用break跳出

  • 用循环输出一个正立的三角形,三角形的大小应该可以由一个int值控制
    如:当这个int为5时,应该输出

    1
    2
    3
    4
    5
    0000*
    000***
    00*****
    0*******
    *********
  • 用循环输出一个倒立的三角形,三角形的大小应该可以由一个int值控制
    如:当这个int为5时,应该输出

    1
    2
    3
    4
    5
    *********
    0*******
    00*****
    000***
    0000*
  • 用循环输出一个菱形,菱形的大小应该可以由一个int值控制
    如:当这个int为5时,应该输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    0000*
    000***
    00*****
    0*******
    *********
    0*******
    00*****
    000***
    0000*

练习答案

本章完

点我返回目录

感谢各位的阅读!

人生不易,仓鼠断气