java中的选择(包括条件表达式)和循环语句(包括foreach循环语句)

在我们敲代码的时候经常会遇到要使用选择语句和循环语句的时候,因为合理的使用这些语句能有效的提高我们代码的质量和性能。
接下来我们说说这些语句!

1、选择语句

先来说说java的关系操作符:

java操作符数学符号名称试例 (半径为1)结果(值是布尔值)
<<小于radius < 0false
<= ≤ \leq 小于等于radius <= 0false
>>大于radius > 0true
< ≥ \geq 大于等于radius >= 0true
==等于radius == 0false
!= ≠ \neq ̸=不等于radius != 0true

注意:相等的关系操作符是两个等号(==),而不是一个等号(=),后者时赋值操作符!

一般得在其他编程语言中这几种关系操作符都是相同的。

java的选择语句中有6种语句

1、单分支if语句
2、双分支if-else 语句
3、嵌套if语句
4、多分支if - else语句
5、switch语句
6、条件表达式
if语句

语法:
if(布尔表达式){
语句(组);
}
if语句只会是表达式为真时才会执行里面的语句(组)。
当花括号内只有一条语句时,则可以省略花括号。下面的if-else语句亦是如此。

双分支if-else语句

语法:

if(布尔表达式){
布尔表达式为真时执行的语句(组);
}
else{
布尔表达式为假是执行的语句(组);
}

流程图如下:

Created with Raphaël 2.2.0 开始 布尔表达式 条件为真时执行的语句(组) 结束 条件为假时执行的语句(组) yes no
嵌套的if语句与多分支if-else语句

嵌套的if-else语句其实就是if-else语句的多重使用,用于解决多重选择问题。
而多分支if-else语句也是用于实现多重选择。在实际写代码过程中如需解决多重选择问题,如果使用这两种语句写建议使用多分支if-else语句,这样更有逻辑感!
两者的区别,请看下面代码:

	//嵌套的if-else语句
		if(score >= 90.0)
			System.out.println("A");
		else
			if(score>= 80.0)
				System.out.println("B");
			else
				if(score >= 70.0)
					System.out.println("C");
				else
					if(score >= 60.0)
						System.out.println("D");
					else
						System.out.println("F");
		/**多分支的if-else语句,这个的层次感分明,让人看着都舒服*/
		if(score >= 90.0)
			System.out.println("A");
		else if(score >= 80.0)
			System.out.println("B");
		else if(score >= 70.0)
			System.out.println("C");
		else if(score >= 60.0)
			System.out.println("D");
		else
			System.out.println("F");
switch语句

switch语句是基于变量或表达式的来执行语句。

应用 :当需选择值来做表达式判断时可用switch语句

语法:

switch(switch表达式){
case 值1:语句(组)1;
break;
case值2:语句(组)2;
break;
case值3:语句(组)3;
break;

case值n:语句(组)n;
break;
default:默认情况下执行的语句(组);
}

注意:
1、switch表达式必须是一个能计算出一个char、byte、short、 int或者String型值,而且必须用括号括住。
2、case后的值的必须与switch表达式的值具有相同的数据类型,且case后的值不可含有变量,如不可出现1+x。
3、关键字break是可选的,break语句会立即终止switch语句。当switch表达式的值与case的值匹配会执行该条case开始的语句,直到遇到break语句或到达该switch语句的结束。
4、break语句与默认情况(default)都是可选的,即可按要求不写。

条件表达式

应用 : 如果要求中只有两到三个判断可采用条件表达式

1、固定式:变量 = (布尔表达式)?值1 :值2;
2、值1和值2中又可以是条件表达式,可以嵌套条件表达式。如 变量 = (布尔表达式)?值1 : (布尔表达式2)?值2:值3;
3、当括号内的表达式为真则变量为冒号前面的值,否则为冒号后面的值。
4、符号?和:在表达式中同时出现。他们构成一种条件操作符,因为操作符数有三个,所以称为三元操作符(ternary operator)。它们是java中唯一的三元操作符。

常见错误与陷阱

1、对布尔值的冗余测试
为了检验测试条件中的布尔型变量是true还是false,像下图的“==true”是多余的;

if (even == true)

System.out.println(“It is even.”);

下面的代码会比上面的好,避免了误将“==”写成“=”的可能,直接测试布尔变量。

if (even)

System.out.println(“It is even.”);

2、悬空else出现的歧义

		int i = 1,j = 2,k = 3;
		if(i > j)
			if(i > k)
				System.out.println("A ");
		else
			System.out.println("B ");

这里的缩进表明else子句是匹配第一个if子句,但实际上是匹配第二个if子句。这就是悬空else歧义。在同一块中,else总是与它最近的if子句匹配。
上一个图的代码是不打印任何东西的。下图的代码会打印出B。

		int i = 1,j = 2,k = 3;
		if(i > j){
			if(i > k)
				System.out.println("A ");
		}
		else
			System.out.println("B ");

3、两个浮点数值的相等比较测试
因为浮点数是具有有限的计算精度,涉及浮点读书的计算可能引入取整错误。因此两个浮点数值的相等测试并不可靠。如下面代码返回值并不是你期望的true,而是false。

double x = 1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1;
System.out.println("x == 0.5 ");

这里x并不能精确到等于0.5,而是0.5000000000000001。.虽然不能依赖于两个浮点数值的相等测试,但是可以通过测试两个数的差距小于某个阈值,来比较它们是否已经足够接近。也就是,对于一个非常小的值&,如果|x-y|<ε,那么x和y非常接近。ε是一个读为“epsilon”的希腊字母,常用于表示个非常小的值。通常,将ε设为10-14 来比较两个double类型的值,而设为10-7来比较两个float类型的值。如下面的代码:

final double EPSILON = 1E-14;//1E-14表示10的负14次方
		double x=1.0-0.1-0.1-0.1-0.1-0.1;
		//Math.abs(x - 0.5)方法用于返回(x - 0.5)的绝对值
		if (Math.abs(x - 0.5) < EPSILON)
			System. out.println(x +"is approximately 0.5");

将显示0.5000000000000001近似0.5。

2、循环语句

1、while循环语句
2、do-while循环语句
3、for循环语句
4、foreach循环语句(Java5以后加的循环语句)
while循环语句

注:while循环在条件为真的情况下,重复的执行语句。
语法:

while(循环继续条件){
//循环体
语句(组);
用于控制循环的附件条件;
}

		int score = 0;
		int i = 1;
		//循环语句
		while(i <10) {
			score += i;
			i ++;//控制循环的附加条件
		}
		System.out.println("score is " + score);//score is 45

注意:在循环条件那要特别注意是小于还是小于等于后面的固定值。

do-while循环语句

注:do-while 循环和while循环基本一样,不同的是它先执行循环体一次,然后判断循环继续条件。
do-while循环是while循环的变体。如果循环中的语句至少执行一次建议使用do-while循环。
语法:

do{
//循环体
语句(组);
}while(循环继续条件);

注意在写完循环继续条件后要加“ ;”。
下面这种情况用do-while比用while较好,因为需要先提示。

		int data;
		int sum = 0;
		Scanner input = new Scanner(System.in);
		//循环语句
		do {
			System.out.print("Enter an integer(the input ends if it is 0):");//当输入0是循环结束
			data = input.nextInt();
			sum+=data;
		}while(data !=0);
		
		System.out.println("sum is " + sum);
for循环

注:for循环具有编写循环的简明语法。
语法:
for(初始操作;循环继续条件;每次迭代后的操作){
//循环体
语句(组);
}
注:for( ; ;){}小括号当中的两个分号不能少。
do-while循环、while循环和for循环的三者比较:

		int i = 0;
		int sum = 0;
		//三个循环都实现相同的功能,把i的值全加起来
		do {
			sum += i;
		}while(i < 10);
		
		while(i < 10) {
			sum +=i;
		}
		
		for(int i = 0;i < 10; i ++) {
			sum +=i;
		}
在敲代码时该采用哪种循环?

while循环和for循环都被称为前测循环,因为继续条件在循环体执行之前检测的;而do-while循环固然就叫后测循环,原因与前两个刚好相反。

这三种循环语句并没有什么好坏之差,只是各有各更适合的应用场景而已。在敲代码时建议使用自己觉得最自然、最舒服的循环语句。

一般的如果已经知道循环要重复的次数,就采用for循环;如无法确定重复次数,就采用while循环;如检验继续条件前需要执行循环体,就用do-while循环代替while循环

在数组中要读取数组的各个元素一般使用for循环,因为简单明了!

foreach循环语句

在java1.5中java开发者又新增了一个循环语句——foreach循环语句:for语句的特殊简化版本,主要执行遍历功能的循环
foreach循环语句是java1.5的新特征之一,在遍历数组、集合方面,foreach为开发者提供了极大的方便。
foreach循环语句的语法格式如下:

for(类型 变量名 :集合){
语句块;
}

其中,“类型”为集合**元素的类型,“变量名”表示集合中的每个元素,“集合”是被遍历的集合对象或数组**。每执行一次循环语句,循环变量就读取集合中的一个元素。
流程图如下:

Created with Raphaël 2.2.0 开始 是否包含元素 执行的语块 结束 yes no

下面是使用foreach循环语句实现一、二和三维数组的遍历和输出。
闲话多说无益,上代码:

public class foreac {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		/**
		 * 声明一个一维数组nu
		 * 并初始化数组值为 1、2*/
		int[] nu = {1,2};
		//使用foreach循环来实现遍历数组元素的功能,并将值逐一赋个number1且逐一输出数组元素的值
		for(int numbe1 : nu) 
			System.out.print(numbe1 + "\t");//\t是Tab键,表示空出几个空格的意思
		
		System.out.println("\n");// \n换行符,使输出这一维数组的元素值与输出下面二维数组的元素值不同行
		/**
		 * 声明一个二维数组in
		 * 并初始化数组元素的值为
		 * 1、2
		 * 3、4*/
		int[][] in = {{1,2},{3,4}};
		for(int[] number : in)//第一个foreach语句是遍历二维数组中的第一行的所有元素,这些元素又暂时形成数组number
			for(int number1 : number) //第二个foreach语句就遍历在第一个foreach语句中形成的数组元素,并将值逐一赋个number1
				System.out.print(number1 + "\t");
			
		System.out.println("\n");
		
		/**
		 * 声明一个三维数组Value
		 * 并初始化数组元素的值
		 * (三维数组是立体的,从正面看过去看到一个二维数组,即
		 * 第一行:567,789,336,229
		 * 第二行:890,995,668,867
		 * 下面的如777,899,868,796
		 * 		999,984,848,888
		 * 则被第一行和第二行的数值遮住(这里只能靠自己的想像力了))*/
		int count =0;		//声明一个变量来计算读取到第几个元素
		double[][][] Value ={{{567,789,336,229},{890,995,668,867}},
				  {{777,899,868,796},{999,984,848,888}},
				  {{912,800,809,706},{909,904,868,898}}};	
		for(double[][] number : Value)//第一个foreach语句是遍历三维数组中的第一面的所有元素,这些元素又暂时形成二维数组number
			for(double[] number1 : number)//第一个foreach语句是遍历二维数组(number)中的第一行的所有元素,这些元素又暂时形成一维数组numbe1
				//第二个foreach语句就遍历一维数组numbe1的数组元素,并将值逐一赋个number2
				for(double number2 : number1) {
					count ++;//迭代计算读取到第几个元素
					System.out.print(number2 + "\t");
					if(count % 8 ==0)//当读取到第8个和8的倍数的个数时,输出的元素换行
						System.out.println("\n");
				}
	}

}

上面代码的运行结果,如下图:
使用foreach语句实现的一、二和三维数组的输出结果,上面代码的输出结果

注:以上为我个人学习的一些分享,对于以上内容如有疑问的地方欢迎评论,如有不当的地方也请在评论区评论为我指出问题,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值