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); //2
int result2 = num1 / num2 * num2;
System.out.println(result2); //10
double result3 = num1 / num2;
System.out.println(result3); //2.0
double result4 = num1 / num2 + 0.0;
System.out.println(result4); // 2.0
double result5 = num1 / (num2 + 0.0);
System.out.println(result5); // 2.4
double result6 = (double)num1 / num2;
System.out.println(result6); // 2.4
// 取余运算:%
// 结果的符号与被模数的符号相同
//开发中经常使用%来判断是否能被除尽
int m1 = 12;
int n1 = 5;
System.out.println("m1 % n1 = " + m1 % n1); //2
int m2 = -12;
int n2 = 5;
System.out.println("m2 % n2 = " + m2 % n2); //-2
int m3 = 12;
int n3 = -5;
System.out.println("m3 % n3 = " + m3 % n3);//2
int m4 = -12;
int n4 = -5;
System.out.println("m4 % n4 = " + m4 % n4);//-2
//(前)++ : 先自增1再运算
//(后)++ : 先运算再自增1
int a1 = 10;
int b1 = ++a1;
System.out.println("a1 = " + a1 + ",b1 = " + b1);// a1 = 11, b1 = 11
int 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,后运算
//(后)-- :先运算,后自减1
int a4 = 10;
int b4 = --a4;
System.out.println("a4 = " + a4 + ",b4 = " + b4);// a4 = 9, b4 = 9
int 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); //12
int num2 = 12;
num2 %= 5; // num2 = num2 % 5;
System.out.println(num2); //2
short 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 ++;(推荐)
// 练习1
int i = 1;
i *= 0.1; //不会改变变量本身的数据类型,截断
System.out.println(i);// 0
i++;
System.out.println(i);// 1
// 练习2
int m = 2;
int n = 3;
n *= m++; // n = n * m++
System.out.println("m=" + m); //3
System.out.println("n=" + n); //6
// 练习3
int 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); // false
System.out.println(i = j); // 20,先将j赋值给i,再打印i
boolean b1 = true;
boolean b2 = false;
System.out.println(b2 == b1); // false
System.out.println(b2 = b1); // true
} }
<a name="eNL45"></a>
### 2.4.4 运算符:逻辑运算符
&—逻辑与 | —逻辑或 !—逻辑非 && —短路与 || —短路或 ^ —逻辑异或
- 逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6 。
- “&”和“&&”的区别:
- 单&时,左边无论真假,右边都进行运算;
- 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
- “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
- 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。 理解:异或,追求的是“异”!
- 逻辑运算符操作的都是boolean类型的变量,而且结果也是boolean类型。
![image.png](https://cdn.nlark.com/yuque/0/2022/png/26120819/1650366718044-2f4ef4bb-96c5-4952-a0d8-604bf5de0b6c.png#clientId=ue468b37d-efb6-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=296&id=ua8b7b9c6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=296&originWidth=810&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45939&status=done&style=none&taskId=u758d9b7e-5818-457b-ad11-967932dd1d6&title=&width=810)
```java
class 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)); //84
System.out.println("i << 3: " + (i << 3)); //168
System.out.println("i << 26: " + (i << 26)); //1409286144
System.out.println("i << 27: " + (i << 27)); //-1476395008
int j = -21;
System.out.println("j << 2: " + (i << 2)); //-84
System.out.println("j << 3: " + (i << 3)); //-168
System.out.println("j << 26: " + (i << 26)); //-1409286144
System.out.println("j << 27: " + (i << 27)); //1476395008
int m = 12;
int n = 5;
System.out.println("m & n: " + (m & n)); //4
System.out.println("m | n: " + (m | n)); //13
System.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); // 12
double 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)
{
// 举例1
int heartBeats = 110;
if(heartBeats < 60 || heartBeats > 100){
System.out.println("需要做进一步检查");
}
System.out.println("检查结束");
//举例2
int age = 23;
if (age < 18){
System.out.println("你得认真学习");
}else{
System.out.println("你得认真工作");
}
//举例3
if (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);
}
}