2.4 运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符 赋值运算符 比较运算符(关系运算符) 逻辑运算符 位运算符 三元运算符
2.4.1 运算符:算术运算符

算术运算符的注意问题
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只 保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x的 结果是?
“+”除字符串相加功能外,还能把非字符串转换成字符串.例如: System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55
s1++; // 自增1不会改变本身变量的数据类型
s2+=2; // 自增2不会改变本身变量的数据类型
class AriTest {public static void main(String[] args) {// 除号:/int num1 = 12;int num2 = 5;int result1 = num1 / num2;System.out.println(result1); //2int result2 = num1 / num2 * num2;System.out.println(result2); //10double result3 = num1 / num2;System.out.println(result3); //2.0double result4 = num1 / num2 + 0.0;System.out.println(result4); // 2.0double result5 = num1 / (num2 + 0.0);System.out.println(result5); // 2.4double result6 = (double)num1 / num2;System.out.println(result6); // 2.4// 取余运算:%// 结果的符号与被模数的符号相同//开发中经常使用%来判断是否能被除尽int m1 = 12;int n1 = 5;System.out.println("m1 % n1 = " + m1 % n1); //2int m2 = -12;int n2 = 5;System.out.println("m2 % n2 = " + m2 % n2); //-2int m3 = 12;int n3 = -5;System.out.println("m3 % n3 = " + m3 % n3);//2int m4 = -12;int n4 = -5;System.out.println("m4 % n4 = " + m4 % n4);//-2//(前)++ : 先自增1再运算//(后)++ : 先运算再自增1int a1 = 10;int b1 = ++a1;System.out.println("a1 = " + a1 + ",b1 = " + b1);// a1 = 11, b1 = 11int a2 = 10;int b2 = a2++;System.out.println("a2 = " + a2 + ",b2 = " + b2);// a1 = 11, b1 = 10// 注意:short s1 = 10;//s1 = s1 + 1; // 编译失败s1 = (short)(s1 + 1); //编译通过s1++; // 自增1不会改变本身变量的数据类型System.out.println(s1);//问题:byte b3 = 127;b3++;System.out.println("b3 = " + b3); //-128//(前)-- :先自减1,后运算//(后)-- :先运算,后自减1int a4 = 10;int b4 = --a4;System.out.println("a4 = " + a4 + ",b4 = " + b4);// a4 = 9, b4 = 9int a5 = 10;int b5 = a5--;System.out.println("a5 = " + a5 + ",b5 = " + b5);// a5 = 9, b5 = 10}}
算术运算符练习:
/*随意给出一个整数,打印显示它的个位数,十位数,百位数的值。*/class AriExer{public static void main(String[] args) {int num = 563;int bai = num / 100;int shi = num % 100 / 10; // int shi = num / 10 % 10;int ge = num % 10;System.out.println("百位为: " + bai);System.out.println("十位为: " + shi);System.out.println("个位为: " + ge);}}
class SetValueTest {public static void main(String[] args){// 赋值符号:=int i1 = 10;int j1 = 10;int i2, j2;// 连续赋值i2 = j2 = 10;//***************************int num1 = 10;num1 += 2; //num1 = num1 + 2;System.out.println(num1); //12int num2 = 12;num2 %= 5; // num2 = num2 % 5;System.out.println(num2); //2short s1 = 10;//s1 = s1 + 2; // 编译失败,将int转换为short有精读损失s1 += 2; // 不会改变变量本身的数据类型System.out.println(s1); //12// 开发中,如果希望变量实现+2的操作,有几种方法?//(前提:int num = 10;)// 方式一:num = num + 2// 方式二:num += 2;(推荐)// 开发中,如果希望变量实现+1的操作,有几种方法?//(前提:int num = 10;)// 方式一:num = num + 1// 方式二:num += 1;// 方式二:num ++;(推荐)// 练习1int i = 1;i *= 0.1; //不会改变变量本身的数据类型,截断System.out.println(i);// 0i++;System.out.println(i);// 1// 练习2int m = 2;int n = 3;n *= m++; // n = n * m++System.out.println("m=" + m); //3System.out.println("n=" + n); //6// 练习3int n1 = 10;n1 += (n1++) + (++n1); // n = 10 + 10 + 12// (n1++)先运算,此时10参与运算,但n1的值变为11;//然后进行+(++n1),n1先自增变为12,再参与运算System.out.println(n1); //32}}
2.4.3 运算符:比较运算符

运算符之三:比较运算符
== != > < >= <= instanceof
结论:
1. 比较运算符的结果是boolean类型
2. 区分 == 和 =
< >= <=:只能使用在数值类型的数据之间。
== 和 !=:不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间 ```java class { public static void main(String[] args) {
int i = 10;int j = 20;System.out.println(i == j); // falseSystem.out.println(i = j); // 20,先将j赋值给i,再打印iboolean b1 = true;boolean b2 = false;System.out.println(b2 == b1); // falseSystem.out.println(b2 = b1); // true
} }
<a name="eNL45"></a>### 2.4.4 运算符:逻辑运算符&—逻辑与 | —逻辑或 !—逻辑非 && —短路与 || —短路或 ^ —逻辑异或- 逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6 。- “&”和“&&”的区别:- 单&时,左边无论真假,右边都进行运算;- 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。- “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。- 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。 理解:异或,追求的是“异”!- 逻辑运算符操作的都是boolean类型的变量,而且结果也是boolean类型。```javaclass Test {public static void main (String [] args) {boolean x=true;boolean y=false;short z=42;//if(y == true)if((z++==42)&&(y=true))z++;if((x=false) || (++z==45)) z++;System. out.println("z="+z); //46}}
2.4.5 运算符:位运算符

位运算是直接对整数的二进制进行的运算。
向左移动一位,数字2,向左移动两位,数字22
位运算符(了解)
结论:
1. 位运算符操作的都是整型的数据
2.<< : 在一定范围内,每向左移一位,相当于2,向左移二位,相当于2²
>> : 在一定范围内,每向右移一位,相当于/2
面试题:最高效方式计算2*8
2 << 3 或 8 >> 1
class BitTest {public static void main(String[] args) {int i = 21;System.out.println("i << 2: " + (i << 2)); //84System.out.println("i << 3: " + (i << 3)); //168System.out.println("i << 26: " + (i << 26)); //1409286144System.out.println("i << 27: " + (i << 27)); //-1476395008int j = -21;System.out.println("j << 2: " + (i << 2)); //-84System.out.println("j << 3: " + (i << 3)); //-168System.out.println("j << 26: " + (i << 26)); //-1409286144System.out.println("j << 27: " + (i << 27)); //1476395008int m = 12;int n = 5;System.out.println("m & n: " + (m & n)); //4System.out.println("m | n: " + (m | n)); //13System.out.println("m ^ n: " + (m ^ n)); //9// 练习:交换两个变量的值int num1 = 10;int num2 = 20;// 方式1:定义临时变量的方式(推荐)int temp = num1;num1 = num2;num2 = temp;System.out.println("num1 = " + num1 + ",num2 = " + num2);// 方式2:好处:定义临时变量//弊端:(1)相加操作可能超出存储范围 (2) 有局限性,只适用于数值类型num1 = num1 + num2;num2 = num1 - num2;num1 = num1 - num2;System.out.println("num1 = " + num1 + ",num2 = " + num2);//方式3:使用位运算符//有局限性,只适用于数值类型num1 = num1 ^ num2;num2 = num1 ^ num2;num1 = num1 ^ num2;System.out.println("num1 = " + num1 + ",num2 = " + num2);}}
2.4.6 运算符:三元运算符
三元运算符
1. 结构:(条件表达式)? 表达式1 : 表达式2
2. 说明
(1) 条件表达式的结果为boolean类型
(2) 根据条件表达式真假决定执行哪个表达式。
如果表达式为true,执行表达式1,为false,则执行表达式2
(3) 表达式1和表达式2要求是一致的,即可以转换为一种类型。
(4) 三元运算符可以嵌套使用
三元运算符与if-else的联系与区别:
(1) 凡是可以使用三元运算符的地方,都可以改写为if-else,反之不成立。if后的代码块可有多个语句 。
(2) 如果程序既可以使用三元运算符,又可以使用if-else,优先使用三元运算符。
优点:简洁,执行效率高
(3) 三元运算符要求必须返回一个结果。
class SanYuanTest {public static void main(String[] args) {//获取两个整数的较大值int m = 12;int n = 5;int max = (m > n)? m : n;System.out.println(max); // 12double num = (m > n)? 2 : 1.0;System.out.println(num); // 2.0//(m > n)? 2 : "n大"; // 编译错误//*************************************String maxStr1 = (m > n)? "m大" : "n大";System.out.println(maxStr1); // m大n = 12;String maxStr2 = (m > n)? "m大" : ((m == n)?"m和n相等" : "n大");System.out.println(maxStr2); // m和n相等//*************************//获取三个数的最大值int n1 = 12;int n2 = 30;int n3 = -43;int max1 = (n1 > n2)? n1 : n2;int max2 = (max1 > n3)? max1 : n3;System.out.println("三个数中的最大值为:" + max2); // m和n相等//不建议int max3 = (((n1 > n2)? n1 : n2) > n3)? ((n1 > n2)? n1 : n2) : n3; // 将max1代入System.out.println("三个数中的最大值为:" + max3);// 改写为if-else:if(m > n){System.out.println(m);}else{System.out.println(n);}}}
2.4.7 运算符的优先级
运算符有不同的优先级,所谓 优先级就是表达式运算中的运算顺序。如右表,上一行运算 符总优先于下一行。 只有单目运算符、三元运算符、 赋值运算符是从右向左运算的。

第2章 Java基本语法(下): 程序流程控制
2.5 程序流程控制
• 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
• 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即: 顺序结构;分支结构;循环结构
顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构
根据条件,选择性地执行某段代码。
有if…else和switch-case两种分支语句。
循环结构
根据循环条件,重复性的执行某段代码。
有while、do…while、for三种循环语句。
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
2.5.1 顺序结构
Java中定义成员变量时采用合法的前向引用。如:
// 正确形式public class Test{int num1 = 12;int num2 = num1 + 2;}// 错误形式public class Test{int num2 = num1 + 2;int num1 = 12;}
2-5-2 分支语句1: if-else结构
分支结构中的if-else(条件判断结构)
一、三种结构第一种:if(条件表达式){执行表达式1}第二种:二选一if(条件表达式){执行表达式1}esle{}第三种:n选一if(条件表达式){执行表达式1}else if(条件表达式){执行表达式2}else if(条件表达式){执行表达式3}...else{执行表达式n}
class IfTest{public static void main(String[] args){// 举例1int heartBeats = 110;if(heartBeats < 60 || heartBeats > 100){System.out.println("需要做进一步检查");}System.out.println("检查结束");//举例2int age = 23;if (age < 18){System.out.println("你得认真学习");}else{System.out.println("你得认真工作");}//举例3if (age < 0){System.out.println("您输入的数据非法");}else if(age < 18){System.out.println("青少年时期");}else if(age < 35){System.out.println("青壮年时期");}else if(age < 60){System.out.println("中年时期");}else{System.out.println("老年时期");}}}
分支结构:if-else使用说明
- 条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
- 语句块只有一条执行语句时,一对{}可以省略,但建议保留
- if-else语句结构,根据需要可以嵌套使用
- 当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略
- 当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓 当多个条件是“包含”关系时,“小上大下 / 子上父下”
每日一考
- “&”和“&&”的异同
- “&”和“&&”的同:
得到的结果相同。都是表示“且”。左右两侧结果均为true时,得到true。
如果左侧结果是true,都会判断右侧结果。
- “&”和“&&”的区别:
- 单&时,左边无论真假,右边都进行运算;
- 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
2.程序输出
class OperatorTest {public static void main(String[] args) {boolean x = true;boolean y = false;short z = 40;if ((z++ == 40) && (y = true)) {z++;}if ((x = false) || (++z == 43)) {z++;}System.out.println("z = " + z);}}//结果为:44
3.定义三个int型变量并赋值,使用三元运算符或者if-else获取这三个数中的较大数的实现
class MaxTest1 {public static void main(String[] args) {int n1 = 23, n2 = 3, n3 = 5;int max1;max1 = (((n1 > n2)? n1 : n2) > n3)? ((n1 > n2)? n1 : n2): n3;System.out.println("max1 = " + max1);}}class MaxTest2 {public static void main(String[] args) {int nu1 = 23, nu2 = 3, nu3 = 5;int max2;if (nu1 >= nu2 && nu1 >= nu3){max2 = nu1;}else if(nu2 >= nu3){max2 = nu2;}else{max2 = nu3;}System.out.println("max2 = " + max2);}}
4.编写程序,声明2个double型变量并赋值。判断第一个数大于10.0,且第2个数小于20.0,打印两数之和。否则,打印两数的乘积。
class IfTest1 {public static void main(String[] args) {double num1 = 23.0, num2 = 3.0;double result1 = (num1 > 10.0 && num2 <20.0)? num1 + num2 : num1 * num2;System.out.println("result1 = " + result1);}}class IfTest2 {public static void main(String[] args) {double numb1 = 23.0, numb2 = 3.0;if (numb1 > 10.0 && numb2 <20.0){double result2 = numb1 + numb2;System.out.println("result2 = " + result2);}else{double result2 = numb1 * numb2;System.out.println("result2 = " + result2);}}}
- 交换两个变量值的代码的实现
class Exchange1 {public static void main(String[] args) {int i1 = 6;int i2 = 3;int temp1 = i1;i1 = i2;i2 = temp1;System.out.println("i1 = " + i1 + "," + "i2 = " + i2);}}class Exchange2 {public static void main(String[] args) {int i3 = 6;int i4 = 3;i3 = i3 + i4;i4 = i3 - i4;i3 = i3 - i4;System.out.println("i3 = " + i3 + "," + "i4 = " + i4);}}




