Java学习笔记三运算符,表达式分支语句和循环语句
【Java学习笔记】三、运算符,表达式、分支语句和循环语句
运算符与表达式
算数运算符与算数表达式
- 加减运算符
- 操作数:2
- 结合方向:从左到右
- 优先级:4级
- 乘(*)、除(/)和取余(%)运算符
- 操作数:2
- 结合方向:从左到右
- 优先级:3级
用算术运算符连接起来的符合Java语法规则的式子称为算数表达式
自增自减运算符
- 操作数:2
- 和C语言中的自增自减运算符一样,自增自减运算符可以放在操作元素的前面或者后面,作用也和C语言中的一样,前置则先执行++或–,后使用操作元素的值,后置则先使用操作元素的值,后执行++或–
算术混合运算的精度
精度从低到高的排序是:
byte short char int long float double
在Java中计算算术表达式的值时,使用以下的精度运算规则:
- 如果表达式中有双精度浮点数,按双精度进行计算
- 如果表达式的最高精度是单精度浮点数,则按单精度进行运算
- 如果表达式中的最高精度是long型,则按long精度进行运算
- 如果表达式中的最高精度低于int型,则按int型精度进行运算
Java允许把不超出byte、short、char的取值范围的常量算术表达式的值赋给byte、short和char型变量
byte x = (byte)30+'a';
是正确的,
byte x = (byte)30+'b;
是错误的
当赋值号右边的表达式中有变量时,编译只检查变量的类型,不检查变量中的值。例如,
byte x = 97 + 1
和
byte 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);
}
}
public class test{
public static void main(String argv[]){
byte x = (byte)30+'a';
if(x)
System.out.println(x);
}
}
逻辑运算符
&&
||
也称为
短路逻辑运算符
,因为当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 | [] () . , ; | |
2 | instanceof 、 ++ 、- - 、 ! | 从右到左 |
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);
}
}
}
while循环
while(表达式)
{
循环体;
}
while语句的执行规则如下:
- 计算表达式的值,为true则进行2,否则进行3
- 执行循环体,再进行1
- 结束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);
}
}
}
需要注意的是,
for(声明循环变量:数组的名字)
必须是变量声明,不可以使用已经声明过的变量。例如,第三个for循环不可以写成:
int i =0;
for(i:a){
System.out.println(i);
}