目录

Java学习笔记三运算符,表达式分支语句和循环语句

【Java学习笔记】三、运算符,表达式、分支语句和循环语句

运算符与表达式

算数运算符与算数表达式

  1. 加减运算符
  • 操作数:2
  • 结合方向:从左到右
  • 优先级:4级
  1. 乘(*)、除(/)和取余(%)运算符
  • 操作数:2
  • 结合方向:从左到右
  • 优先级:3级

用算术运算符连接起来的符合Java语法规则的式子称为算数表达式

自增自减运算符

  • 操作数:2
  • 和C语言中的自增自减运算符一样,自增自减运算符可以放在操作元素的前面或者后面,作用也和C语言中的一样,前置则先执行++或–,后使用操作元素的值,后置则先使用操作元素的值,后执行++或–

算术混合运算的精度

精度从低到高的排序是: byte short char int long float double

在Java中计算算术表达式的值时,使用以下的精度运算规则:

  1. 如果表达式中有双精度浮点数,按双精度进行计算
  2. 如果表达式的最高精度是单精度浮点数,则按单精度进行运算
  3. 如果表达式中的最高精度是long型,则按long精度进行运算
  4. 如果表达式中的最高精度低于int型,则按int型精度进行运算

Java允许把不超出byte、short、char的取值范围的常量算术表达式的值赋给byte、short和char型变量

byte x = (byte)30+'a'; 是正确的, byte x = (byte)30+'b; 是错误的

当赋值号右边的表达式中有变量时,编译只检查变量的类型,不检查变量中的值。例如, byte x = 97 + 1byte y = 1 都是正确的,但是 byte z = 97 + y 是错误的,这是因为表达式右侧按int进行运算,不检查y中的值,所以会提示类型不兼容

关系运算符与关系表达式

关系运算符是二目运算符,用来比较两个值的关系。关系运算符的运算结果是boolean,当运算符对应的关系成立时,结果为 true ,否则为 false

运算符优先级结合方向
>6从左到右
<6从左到右
>=6从左到右
<=6从左到右
==7从左到右
!=7从左到右

逻辑运算符和逻辑表达式

逻辑运算符包括 && || !

&&|| 为二目运算符,实现逻辑与、逻辑或

! 为单目运算符,实现逻辑非

逻辑表达式的操作元 必须是boolean型数据

运算符优先级结合方向
&&11从左到右
!2从右到左

结果为boolean型的变量或表达式可以通过逻辑运算符形成逻辑表达式,和C语言不同,Java不能用零或非零表示true或false,所以不能用常量或整数型变量作为逻辑运算符的操作元,例如,以下两种写法都是错误的

public class test{
	public static void main(String argv[]){
		byte x = (byte)30+'a';
		if(1)
			System.out.println(x);
	}
}

https://i-blog.csdnimg.cn/direct/e951517e82b74ba2a0c1ecad347a2957.png

public class test{
	public static void main(String argv[]){
		byte x = (byte)30+'a';
		if(x)
		System.out.println(x);
	}
}

https://i-blog.csdnimg.cn/direct/357a482a444f44ae9a67a897d1173e5c.png

逻辑运算符 && || 也称为 短路逻辑运算符 ,因为当op1的值是false时, && 运算符就不再去计算op2的值,无论op2是true或false,表达式 op1&&op2 的结果都是false;当op1的值是true时, || 运算符就不再去计算op2的值,无论op2是true或false,表达式 op1||op2 的结果都是true。合理的利用短路运算可以提高程序运行效率

位运算符

整型数据在内存中以二进制的方式表示,最高位为符号位,位运算符就是对整型数据对每个二进制分别进行位操作

位运算符包括: 按位与&按位或|按位非!按位异或^

  • 按位与就是将左右两个操作元的对应每一位进行与&操作,都为1则结果为1,有一个是0则结果为0
  • 按位或就是将左右两个操作元的对应每一位进行或|操作,有一个操作元的该位为1则结果为1,均为零则结果为零
  • 按位非就是按位取反,将操作数的每一位0变1,1变0
  • 按位异或就是对两个操作元每个二进制位进行异或操作,相同为0,相异为1

instanceof运算符

instanceof运算符是二目操作符,左边的操作元是一个对象,右边是一个类,当左边的对象是右边类或子类创建的对象时,运算结果为true,否则为false

总结

优先级运算符结合方向
1[] () . , ;
2instanceof 、 ++ 、- - 、 !从右到左
3* / %从左到右
4+、-从左到右
5» 、«、 »>从左到右
6< 、<=、 >、 >=从左到右
7== 、!=从左到右
8&从左到右
9^从左到右
10
11&&从左到右
12
13?:从右到左
14=从右到左

分支语句

语法上看,Java的分支语句和C语言的分支语句几乎完全相同

if条件分支语句

if语句

if语句是单条件、单分支语句

if(表达式
{
语句
}

if后的表达式的值必须为boolean型,同样不能像C语言一样使用零或非零表示

如果表达式为true则执行花括号后的语句,否则不执行

如果语句只有一条,可以省略花括号,建议写上,保持良好的代码风格

if-else语句

if-else语句是单条件、双分支语句

if(表达式1)
{
    语句1
}
else
{
    语句2
}

if-else语句同样需要表达式为boolean型,如果值为true则执行语句1,否则执行语句2

if-else if-else语句

if-else if-else语句是多条件、多分支语句

if(表达式1)
{
    语句1;
}
else if(表达式2)
{
    语句2;
}
else
{
    语句3;
}
  • 若表达式1为true,则执行语句1;

  • 若表达式1为false,判断表达式2,

    • 若表达式2为true,执行语句2,
    • 若表达式2为false,执行语句3

如果有更多的if-else语句也是同理,逐次向下判断表达式的值,直到有一个值为true或所有的值均为false,然后执行else

switch

switch语句是单条件、多分支的开关语句

switch(表达式){
	case 常量值1:
			若干语句
			break;
	case 常量值2:
			若干语句
			break;
	......
	case 常量值n:
			若干语句
			break;
	default:
			若干语句
}

switch语句中,表达式的值可以是byte short int char String类型,但不可以是long型

switch语句首先计算表达式的值,如果表达式的值与某个case后的常量值相同,就执行该case后面的语句,直到遇到break退出,如果没有break语句,那么会继续执行后面其他case后的语句。如果表达式的值与任何case都不相同,则执行default后的语句,default是可选的,如果没有default,并且表达式的值不与任何的常量值相同,那么switch语句就不会进行任何处理

循环语句

语法上看,Java的循环语句和C语言的循环语句基本相同,但Java中没有 goto 语句

for循环

for ( i = 0; i < length; i++)
{    //初始化 // 判断   //调整
    语句//循环体
}   
1.for后面的括号中包括三个内容,依次为:

	对变量的初始化  循环条件判断  对某些变量的调整(一般是控制循环退出的变量)

	两两之间用分号间隔

2.上述三项内容中,初始化可省略(不建议),可在初始化处定义新变量,但只能在循环内使用该变量

3.for循环条件判断可由多个变量控制,用&&(与)||(或)分割

4.若省略循环条件判断,会使判断恒成立,进入死循环

5.有两条及以上语句时,需加大括号

6.循环体可为空语句
public class test{
	public static void main(String argv[]){
		for (int i = 0; i < 10; i++) {
			System.out.println(i);
		}
	}
}

https://i-blog.csdnimg.cn/direct/b76310e295fe4736bdf469ac1ad5d042.png

while循环

while(表达式)
{
    循环体
}

while语句的执行规则如下:

  1. 计算表达式的值,为true则进行2,否则进行3
  2. 执行循环体,再进行1
  3. 结束while语句

do-while循环

do
{
   //循环体;         
} 
while (表达式);

do-while循环和while循环的区别是do-while循环至少执行一次,执行第一次后再计算表达式的值,为true则继续执行,否则结束循环。一般在循环体中要加入对表达式值的调整,否则容易进入死循环

break和continue

break 在循环中起到跳出循环的作用,当程序执行到break语句时,无论循环条件是否满足,直接跳出循环

continue 用于跳过本次循环中,位于continue后面的语句,进入下一次循环

1.continue不能直接跳出循环,而是跳过本次循环剩余的语句	
2.continue在for和while中有不同的效果
	(1)在for循环中,continue跳过后,for(表达式1;表达式2;调整)  调整部分仍然会执行,不影响整体循环的退出
	(2)在while/do while循环中,continue会跳过剩余全部代码,若调整部分位于continue后,则不会执行,可能会影响循环的退出

for循环和数组

JDK5对for语句的功能给予了扩充、增强,以便更好的遍历数组。。语法如下:

for(声明循环变量:数组的名字){
	...
}

其中,声明的循环变量的类型必须和数组的类型相同。

这种类型的for循环可以理解为“每次循环依次取数组中每一个元素的值”

声明的变量中取出的是数组元素的 ,而不是索引下标

这种方式只能访问查看数组元素,不能对数组元素进行修改

看个 例子

public class test{
	public static void main(String argv[]){
		int a[]={1, 2, 3, 4};
		char b[] = {'a', 'b', 'c', 'd'};
		for (int n = 0; n < a.length; n++) {//传统的for循环
			System.out.printf("%d ", a[n]);
		}
		System.out.println();
		for (int n = 0; n < b.length; n++) {//传统的for循环
			System.out.printf("%c ", b[n]);
		}
		System.out.println();
		for (int i : a) {		//循环变量i依次取出a数组中的每个元素
			System.out.printf("%d ", i);
		}
		System.out.println();
		for (char ch : b) {		//循环变量ch依次取出b数组中的每个元素
			System.out.printf("%c ",ch);
		}
	}
}

https://i-blog.csdnimg.cn/direct/40bffb36e7734f2da3092d153b3af644.png

需要注意的是, for(声明循环变量:数组的名字) 必须是变量声明,不可以使用已经声明过的变量。例如,第三个for循环不可以写成:

int i =0;
for(i:a){
	System.out.println(i);
}