分支结构 if...else和switch...case

1.1 顺序结构

任何编程语言中最常见的程序结构就是顺序结构,顺序结构就是程序从上到下一行一行的执行。如果mian方法
多行代码之间没有任何流程控制,程序总是从上往下依次执行。

1.2分支结构

java语言提供了两种常见的分支控制结构:if语句和switch语句,其中if语句使用布尔表达式或布尔值作为分支条件
来进行分支控制;而switch语句用于对多个整型值进行分配,从而实现分支控制。

1.2.1 if条件语句

if语句使用布尔表达式或布尔值作为分支条件进行控制,有如下三种形式:

第一种形式:

	if(true){
		statements...
	}	
第二种形式:

	if(true)
	{
		statements...
	}
	else
	{
		statements...
	}
第三种形式:

	if(true)
	{
		statements...
	}
	else if(true)
	{
		statements...
	}
	else
	{
		statements...
	}
如果if()、else if()和else后的语句块只有一行语句时,则可以省略花括号,因为单行语句本身就是一个
整体,无须花括号来把他们定义为一个整体。如下代码

	int a = 5
	if(a > 4)
		System.out.println("a大于4");	
	else
		System.out.println("a不大于4");
通常我们不建议省略if、else、else if后执行块的花括号,即使条件执行体只有一行代码,因为保留花括号
会有更好的可读性


对于if语句,还有一个很容易出现的逻辑错误,这个逻辑错误并属于语法错误,但引起错误的可能性更大。
代码如下:

	public static void main(String[] args) {
		int age = 45;
		if(age > 20){
			System.out.println("青年人");
		}else if(age > 40){
			System.out.println("中年人");
		}else if(age > 60){
			System.out.println("老年人");
		}
	}
运行一下会发现结果是”青年人“,而我们的本意是45岁是中年人。显然出现了问题。
对于任何的 if else 语句,表面上看起来else后面没有任何条件,或者else if后只有一个条件,但这不是
真相,else的隐含条件是对前面条件取反。 我们队上面的代码进行修改,如下:

	public static void main(String[] args) {
		int age = 40;
		if (age > 60) {
			System.out.println("老年人");
		} else if (age > 40) {
			System.out.println("中年人");
		} else if (age > 20) {
			System.out.println("青年人");
		}
	}
这样运行就得到正确结果。为了避免出现上面的错误,在使用if...else语句有一条基本规则:总是优先把包含
范围小的条件放在前面处理,如age > 60 和 age > 20两个条件,明显age > 60的范围更小,所以优先处理age > 60
的情况。

1.2.2 switch分支语句

switch语句由一个控制表达式和多个case标签组成,和if语句不同的是,switch语句后面的控制表达式的数据
类型只能是byte、short、char、int四种整数类型,枚举和String类型(从java7才允许),不能是boolean型。case标签后紧跟一个代码块,case标签作为这个代码块的标识。语法如下:

	switch(expression)
	{
		case condition1:
		{
			statements...
			break;
		}
		case condition2:
		{
			statements...
			break;
		}
		case condition3:
		{
			statements...
			break;
		}
		default:
		{
			statements...
			break;
		}
	}	
这种分支语句的执行是先对expression求值,然后依次匹配condition1、condition2...conditionN等值,
遇到匹配的值即执行对象的执行体;如果所有的case标签后的值都不与expression表达式的值相等,则执行default
标签后的代码
和if语句不通的是。switch语句中个case标签前后代码块的开始点和结束点非常清晰,因此完全可以省略case后
代码块的花括号。与if语句中else类似,switch语句中default标签看似没有条件,其实是有条件的:条件就是
expression表达式的值不能与前面任何一个case标签后的值相等。
在case标签后的每个代码块后都有一个break语句,这个break语句具有十分重要的意义。如果我们把break语句
注释掉,会发现只要expression的值只要和case标签后的值相等,程序就执行case标签后代码块,除非遇到break

才会中断。所以说千万不能省略break;

因为Java的switch语句允许case后代码块没有break,下面看一段代码,省略了break会使什么情况:

	public static void main(String[] args) {
		char score = 'C';
		switch (score) {
		case 'A':
			System.out.println("优秀");
			break;
		case 'B':
			System.out.println("良好");
			break;
		case 'C':
			System.out.println("中");
//			break;
		case 'D':
			System.out.println("及格");
//			break;
		case 'F':
			System.out.println("不及格");
//			break;
		default:
			System.out.println("成绩输入错误");
//			break;
		}
	}

打印出的结果是:


及格
不及格
成绩输入错误


这个运行结果看起来比较奇怪,但这是由switch语句的运行流程决定的:switch语句会先求出expression表达式的值,然后拿这个表达式的值和case标签后的值进行比较,一旦遇到相等的值,程序

就开始执行这个case标签后的代码,不再判断与后面case、default标签的条件是否匹配,除非遇到break才会结束。


















你可能感兴趣的:(控制流程和数组)