最基本的程序结构,按照代码编写的顺序,从上到下执行。根据要完成的功能,把这些工作编写成代码序列,然后按照这样的顺序执行就可以了。
例:下面的代码输出数字1
到5
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
程序运行的时候,先执行第一行,然后第二行……
直到执行完所有行。
除了这种顺序结构之外,还有选择结构和循环结构。本次内容介绍选择结构,下次介绍循环结构。
选择结构
在程序执行的过程中,会根据特定的条件选择执行某些语句,例如要计算两个整型变量a
和b
的最大值,有可能是a
,也有可能是b
,这时候需要根据a
和b
的关系来选择把a
的值作为最大值,还是把b
的值作为最大值。
选择结构包括两个:if
和switch
。
1. if语句
if
语句就是在满足一定条件的时候,会执行一些语句。
基本结构:
if(
条件表达式)
{
语句
}
条件表达式的结果必须是boolean
类型的值,要执行的语句可以是多条,每条语句以分号结束即可。
如果条件表达式的值为true
,将执行括号中的语句。如果条件表达式的值为false
,则不会执行括号中的语句。
【例】求a
和b
的最大值。
// IfTest.java
public class IfTest {
public static void main(String[] args) {
int a = 10;
int b = 8;
int max = a;
if(a<b)
{
max = b;
}
System.out.println("最大值为:"+max);
}
}
运行结果为:
最大值为:10
如果括号中要执行的代码只有一行,可以不写括号,上面代码中main
方法中的代码可以改写成:
int a = 10;
int b = 8;
int max = a;
if(a<b)
max = b;
System.out.println("最大值为:"+max);
if
语句还可以被用于在两组语句中选择执行一组,要么执行第一组,要么执行第二组。基本结构如下:
if(
条件表达式)
{
语句1
}
else
{
语句2
}
如果条件表达式的值为true
,就执行语句1
,否则将执行语句2
。语句1
和语句2
总会有一个被执行。语句1
和语句2
都可以是多行,如果只有一行,则相应的括号可以省略。
例:使用if
和else
,完成上面的求最大值的功能。
使用下面的代码替换上面例子的main
方法中的代码即可。
int a = 10;
int b = 8;
int max;
if(a<b)
{
max = b;
}
else
{
max = a;
}
System.out.println("最大值为:"+max);
运行的结果与上面的相同。
else
后面的语句本身也可以使用if
语句
,
这时候就会出现这样的结构
:
if(
条件表达式1)
{
语句1
}
else if(
条件表达式2)
{
语句2
}
[else{
语句3}]
[else{
语句3}]
表示这部分内容可以有
,
也可以没有
,
需要根据情况而定。这种格式的作用是:如果条件表达式1
的结果为true
,执行语句1
,如果条件表达式1
的结果为false
,而条件表达式2
的结果为true
,执行语句2
,否则执行语句3
(如果有最后的else
)。这时候完成的功能不再是在两个语句中选择执行一个,而是在多个语句中选择执行一个,这时候可以嵌套很多层。
【例】整型变量a
的值可能是1
、2
、3
和4
,如果a
为1
,则输出“进行加法运算”,a
为2
,则进行减法运算,a
为3
,则进行乘法运算,a
为4
,则进行除法运算。
// IfElseTest.java
public class IfElseTest {
public static void main(String[] args) {
int a=3;
if(a==1)
System.out.println("进行加法运算");
else if(a==2)
System.out.println("进行减法运算");
else if(a==3)
System.out.println("进行乘法运算");
else
System.out.println("进行除法运算");
}
}
运行结果为
:
进行乘法运算
如果改变a
的值
,
运行结果会发生相应的变化。
2. switch语句
switch
语句完成的功能是在多种情况中选择一个执行。就像上面的例子,根据整型变量a
的值,输出不同的内容,也就是执行不同的语句,就可以使用switch
语句。
switch
语句的基本结构如下:
switch(
表达式)
{
case
值1:
语句1
case
值2:
语句2
…
case
值n:
语句n
default:
语句n+1
}
如果表达式的值为“值1
”,则从“语句1
”开始执行,如果表达式的值为“值2
”,则从“语句2
”开始执行,如果表达式的值为“值n
”,则从“语句n
”开始执行,如果表达式的值没有与任何case
匹配,则执行default
,进行匹配的顺序是从前到后。这里的“语句1
”、“语句2
”、“语句n
”和“语句n+1
”指的不是一条语句,可以是多条语句。
先看下面的例子:
【例】
// SwitchTest.java
public class SwitchTest {
public static void main(String[] args) {
int a=2;
switch(a)
{
case 1:System.out.println("进行加法运算");
case 2:System.out.println("进行减法运算");
case 3:System.out.println("进行乘法运算");
case 4:System.out.println("进行除法运算");
default:System.out.println("a的值不合法");
}
}
}
运行结果为
:
进行减法运算
进行乘法运算
进行除法运算
a的值不合法
从运行结果上看,并没有达到预期的目的,按照预期应该只输出“进行减法运算”,也就是运行结果的第一行。为什么会得到这样的结果,是因为switch
结构中,匹配成功之后的所有代码都会执行,也就是case
表达式仅仅决定了程序的入口。如果把变量a
的类型定义成long
类型,编译会报错。所以应该注意两点:
(1)
表达式的结果可以是short
类型、byte
类型、int
类型、char
类型和实现Enumeration
接口的类型。不能使用long
、float
和double
等。
(2) case
匹配成功,只确定程序的入口。
要完成上面的功能,需要在每个case
语句之后添加一个break
,beak
语句可以跳出选择结构,不再执行后面的代码,修改后的代码如下:
【例】
// SwitchTest2.java
public class SwitchTest2 {
public static void main(String[] args) {
char a=2;
switch(a)
{
case 1:System.out.println("进行加法运算");break;
case 2:System.out.println("进行减法运算");break;
case 3:System.out.println("进行乘法运算");break;
case 4:System.out.println("进行除法运算");break;
default:System.out.println("a的值不合法");
}
}
}
运行的结果为
:
进行减法运算
这就是希望的结果了。
if
语句和switch
语句都是选择结构,如果选择比较少的情况应该使用if
语句,如果选项比较多的时候应该使用switch
。
另外,if
语句的条件是布尔类型,而switch
语句的条件是整数类型(包含char
类型,而不包含long
类型)和枚举类型。
【注意】不管使用if
语句还是使用switch
语句,都要把最常用的情况放在最前面,因为这样平均匹配次数就少了,如果把最常出现的选项放在了最后,这样每次都要进行几乎所有的匹配。
上一次:
第十讲基本运算——运算符
下一次:第十二讲 循环结构