赋值运算符(=
)
将等号”=“右边表达式的结果赋值给左边的变量或final修饰的常量
代码展示:
public class Test{
public static void main(String[] args){
int num = 3*5;
System.out.println(num)// 15
}
}
练习:实现交换两个变量的值
方式一:定义一个临时变量temp
优点:方便理解,通俗易懂
缺点:需定义临时变量,占用内存
代码展示:
public class VariableTest{
public static void main(String[] args){
int num =3,num1 =5;
int temp = num;
num = num1;
num1 = temp;
System.out.println("num = " + num + "\n num1 = " + num1);
}
}
画图分析:
运行截图:
方式二:一加两减
优点:不太好理解
缺点:无需定义临时变量,节约内存
代码展示:
public class ChangeValue{
public static void main(String[] args){
int num1 = 1,num2 = 2;
num1 = num1 + num2;// num1 = 3;
num2 = num1 - num2 ;// 3-2 = 1; num2 = 1
num1 = num1 - num2;// 3 - 1 = 2;num =2
System.out.println("num1 = "+ num1+"\nnum2 = " + num2);
}
}
运行截图:
方式三:使用位运算
优点:操作的是二进制,效率高
缺点:非常不好理解
代码展示:
public class OperationTest010{
public static void main(String[] args){
int num1 = 3,num2 = 5;
num1 = num1 ^ num2;// num1 = 3 ^ 5
num2 = num1 ^ num2;// num2 = 3 ^ 5 ^ 5 = 3
num1 = num1 ^ num2;// num1 = 3 ^ 5 ^ 3 = 5
System.out.println("num1 = " +num1 + "\nnum2= " + num2);
}
}
运行截图:
算术运算符分类
- 一元运算符,只需一个操作数参与运算
- 二元运算符,需两个操作数参与运算
二元运算符
+、-、*、/、%
+
功能:
- 加法运算
- 拼接操作
- 表示正数
代码展示:
public class OperationTest1{
// 编写main方法,程序的入口,写法固定,能被Java虚拟机识别
public static void main(String[] args){
// 加法运算
System.out.println(3+5);
// 拼接操作
System.out.println("7758"+458);
// 表示整数
System.out.println(+48);
}
}
运行截图:
-
功能:
- 减法运算
- 表示负数
代码展示:
public class OperationTest2{
public static void main(String[] args){
// 减法运算
System.out.println(10-5); // 5
// 表示负数
System.out.println(-15);// -15
}
}
运行截图:
*
功能:
- 乘法运算
代码展示
public class multiplyTest{
public static void main(String[] args){
System.out.println(9*9); // 81
}
}
/
功能:
- 除法运算
代码展示:
public class divideTest{
public static void main(String[] args){
System.out.println(10/5); //2
}
}
%
功能:
-
取模|取余运算,用于获取两个数不能整除的余数
使用场合:判断m是否能被n整除
若m能被n整除,则m%n的结果为0
若m不能被n整除,则m%n的结果不为0
注意:0模任何一个数,结果还是0
代码展示:
public class OperationTest{ public static void main(String[] args){ System.out.println(0 % 3);// 0 System.out.println(1 % 3);// 1 System.out.println(2 % 3);// 2 System.out.println(3 % 3);// 0 System.out.println(4 % 3);// 1 } }
运行截图:
注意:
-
在java中,被除数不能为0,否则会抛出
java.lang.ArithmeticException
异常代码展示:
public class OperationTest3{ public static void main(String[] args){ System.out.println(3/0); } }
运行截图:
在
js
中,被除数可为0,结果要么为infinity正无穷大|-infinity负无穷大代码展示:
var num1 = 3 / 0; var num2 = -3 / 0; console.log("value = "+num1+"\ntype = " + typeof(num1)); console.log("value = "+num2+"\ntype = " + typeof(num2));
运行截图:
-
在java中,两整数相除,结果要么为long,要么为int,结果
一定
是一个整数代码展示:
public class OperationTest4{ public static void main(String[] args){ System.out.println(5/3); // 1 } }
运行截图:
随堂练习:
-
获取用户从控制台输入的整数,判断这个是是奇数还是偶数
代码展示:
// 1. 导包 import java.util.Scanner; public class OperationDemo{ public static void main(String[] args){ // 2.实例化Scanner对象 Scanner input = new Scanner(System.in); // 提示性文字,为了提高用户体验 System.out.println("请输入一个整数:"); int num = input.nextInt(); if( num % 2 == 0){ System.out.println(num + "是偶数"); } else{ System.out.println(num + "是奇数"); } } }
运行截图:
-
获取987的百位数、十位数和个位数
代码展示:
public class OperationDemo1{ public static void main(String[] args){ int num = 987; System.out.println( "个位" + (num % 10)); System.out.println("百位" + ( num / 100)); System.out.println("十位" + (num % 100 / 10)); System.out.println("十位" + (num / 10 % 10)); } }
运行截图:
一元运算符
++,自增运算符,++num
|num++
等效于: num = num+1
代码展示:
public class OperationTest78{
public static void main(String[] args){
int num = 5;
num++;
System.out.println(num); // 6
int num1 = 6;
++num1;
System.out.println(num1);// 7
}
}
运行截图:
++num
和 num++
的区别:
核心:自增运算符和别的操作数一起运算时才有区别
++num
特点:先自增,后运算
num++
特点:先运算,后自增
代码展示:
public class OperationTest44{
public static void main(String[] args){
int num = 3,num2 = 5;
int sum = num ++ + 5;
int sum2 = ++num2 + 1;
System.out.println("sum = " + sum + "\nnum = " + num + "\nsum2 = " + sum2 + "\nnum2 = " + num2 ); // sum = 8 num = 4 sum2 = 7 num2 = 6
}
}
运行截图:
–,自减运算符,--num|num--
等效于:num = num -1;
代码展示:
public class OperationDemo40{
public static void main(String[] args){
int num = 7;
num --;
System.out.println(num);
int num1 = 7;
-- num1;
System.out.println(num1);
}
}
运行截图:
--num
和num--
的区别:
核心:自减运算符和别的操作数一起运算时才有区别
--num
特点:先自减,后运算
num--
特点: 先运算,后自减
代码展示:
public class OperationDemo41{
public static void main(String[] args){
int num = 1;
int sum = num-- + 5;
System.out.println("sum = " + sum + "\nnum = " + num);// sum = 6 num = 0
int num1 = 12;
int sum1 = -- num1 + 1;
System.out.println("sum1 = " + sum1 +"\nnum1 = " + num1);// sum = 12 num1 = 11
}
}
运行截图:
注意事项:
-
自增&自减运算符是一个整体,中间不准许有空格
代码展示:
// 正确写法 public class OperationDemo2{ public static void main(String[] args){ int num = 3; num++; System.out.println(num);// 4 } }
运行截图:
代码展示:
// 下面写法是错误的 public class OperationDemo2{ public static void main(String[] args){ int num = 3; num+ +; System.out.println(num); } }
编译错误截图:
-
固定值常量&final修饰的常量不能做自增自减运算,只有整形变量可以,因为常量只能被赋值一次
代码展示:
public class ConstantDemo{ public static void main(String[] args){ final int num = 12; num++; System.out.println(num); } }
编译错误截图:
代码展示:public class ConstantDemo1{ public static void main(String[] args){ int num = 5--; System.out.println(num); } }
编译错误截图:
经典面试题:
-
int num = 5;
num = num++;
请问代码执行完后
num
的值为多少?代码展示:
public class OperationDemo45{ public static void main(String[] args){ int num = 5; num = num ++; System.out.println("num = " + num);// num = 5; } }
运行截图:
问:为什么输出结果是5不是6?
答:这题主要考察了
num++
底层到底做了什么 第一步,定义了一个临时变量temp,用于存储num的原始值
int temp = num ;
// temp = 5 第二步,执行“
num++
”自增操作
num = num + 1
// num = 6 以上两步执行完毕,证明“=”等号右边执行完毕
以下这个步骤,执行的是赋值操作
第三步:把num的原始值赋值给等号左边的变量
num = temp;
// num = 5
随堂练习:
-
int a = 3,b = 4;
求a++ / 3 + --b * 2 - a-- % 6 + b++ * 3 - ++b
的值代码展示:
/* a = 3 b = 5 3 / 3 + 3 * 2 - 4 % 6 + 3 * 3 - 5 = 7 */ public class GetValue{ public static void main(String[] args){ int a = 3,b = 4; int value = a++ / 3 + --b * 2 - a-- % 6 + b++ * 3 - ++b; System.out.println("value = " + value + "\na = " + a + "\nb = " + b); } }
运行截图:
扩展赋值运算符
本质:是赋值运算符和算术运算符中的二元运算符的综合体
+= | m+=n | m=(m的数据类型)(m+(n)) |
---|---|---|
-= | m-=n | m=(m的数据类型)(m-(n)) |
*= | m*=n | m=(m的数据类型)(m*(n)) |
/= | m/=n | m=(m的数据类型)(m/(n)) |
%= | m%=n | m=(m的数据类型)(m%(n)) |
描述:以上m和n都是变量,n可以是一个表达式,+=、%=、-=、*=、/=操作的是等号“=”右边n表达式的结果
注意事项:
-
请问
int sum = 3;sum *= 3 + 2;
执行完后,sum的结果是多少?答:sum的结果是15.详情看如下代码.
代码展示:
public class OperationDemo69{ public static void main(String[] args){ int sum = 3; sum *= 3 + 2; // 等价于sum = sum*(3+2); System.out.println("sum = " + sum); } }
运行截图:
强调
:扩展赋值运算符操作的是等号右边表达式的结果 -
short num = 11;num = num + 1
和short num = 11; num += 1;
哪一个正确呢?答:
short num = 11;num += 1;
正确,因为num += 1
等价于num = (short) num + 1;
short num = 11;num = num + 1
错误,因为若两两个操作数中既没有float类型、也没有long类型、也没有double类型,那最终的结果为int类型,这里应该为int类型,而这个num
最终为short类型,故会出现编译错误:类型转换错误代码展示:
public class OperationTest79{ public static void main(String[] args){ short num = 11; num = num + 1; System.out.println(num); } }
编译错误截图:
代码展示:
public class OperationTest80{ public static void main(String[] args){ short num = 11; num += 1; System.out.println(num); } }
运行截图:
随堂练习:
-
获取三个学生的成绩,并计算三个学生成绩的平均分
要求:使用扩展赋值运算符实现
// 1. 导包 import java.util.Scanner; public class ScoreTest{ public static void main(String[] args){ // 2. 实例化Scanner对象 Scanner input = new Scanner(System.in); double sum = 0; for(int i = 1;i <= 3;i++){ // 提示性文字,为了提高用户体验 System.out.println("请输入第"+i+"个学生的成绩"); sum += input.nextDouble(); } System.out.println("学生的总成绩"+sum + "\n平均分 avgScore = " + sum / 3); } }
运行截图:
比较运算符
包含:> 、>=、<、<=、==、!=
特点:“比价运算符”返回的结果肯定是boolean类型,条件成立返回true,否则返回false
代码展示:
public class BooleanTest1{
public static void main(String[] args){
boolean flag = 3>5;
boolean flag1 = 3<5;
boolean flag2 = 5==5;
boolean flag3 = 5!=6;
boolean flag4 = 5>=7;
boolean flag5 = 5<=7;
System.out.println("flag = " + flag + "\n flag1 = "+flag1+"\n flag2 = "+ flag2+"\n flage3 = "+flag3+"\n flag4 = "+flag4 + "\n flag5 = "+flag5);
}
}
运行截图:
==
和 !=
的作用:
==:
-
比较基本数据类型时,用于判断左右两边的数值是否相同
代码展示
public class CompareTest{ public static void main(String[] args){ System.out.println(5==5);// true System.out.println(5==6);// false } }
-
比较引用数据类型时,用于判断两个对象的地址是否相同
代码展示:
public class CompareTest{ public static void main(String[] args){ String name = new String("我的名字叫小编"); String hobby = new String("我的爱好是打篮球"); String copyName = name; System.out.println(name == copyName);// true System.out.println(hobby == name);// false } }
运行截图:
!=:用于判断两个数值是否不相同,如果不相同则返回true,否则返回fasle
代码展示:
public class CompareTest1{
public static void main(String[] args){
System.out.println(5 != 5); // false
System.out.println(5 != 6);// true
}
}
运行截图:
注意事项:
-
注意区分“=”和“==”的区别
“=”,表示赋值运算符
“==”,表示比较运算符
-
建议使用“==”时,常量放左边,变量放右边
好处:把问题尽量暴露在编译时,勿暴露在运行时
代码展示:
public class CompareTest2{ public static void main(String[] agrs){ boolean flag = true; // 建议:if(flase = flag) if(flag = false){ System.out.println("flag的值为 true"); }else{ System.out.println("flag的值为false"); } } }
运行截图:
代码展示:
public class CompareTest3{ public static void main(String[] agrs){ boolean flag = false; if( true == flag){ System.out.println("flag的值为"+ flag); }else{ System.out.println("flag的值为"+flag); } } }
运行截图:
逻辑运算符
包含:^、&、&&、||、|、!
特点:参与逻辑运算的数据类型必须是boolean类型,且返回的结果也是boolean类型
& 与运算(二元运算符,有4种可能)(重点
)
结论:
- 只有两边都为true,结果才为true
- 只要有两边有一个为false,结果就为false
辅助记忆:小明与
小红来一趟办公室,两个都来才行,来一个或者都不来都不行
代码展示:
public class LogicTest{
public static void main(String[] args){
System.out.println(false&true);// false
System.out.println(false&false);//false
System.out.println(true&false);// false
System.out.println(true&true);//true
}
}
运行截图:
|或运算(二元运算符,有四种可能)(重点
)
结论:
- 只有两边都为fasle,结果才为false
- 只要两边有一个为true,结果就为true
辅助记忆:小红或
小明来一趟办公室,两个中来一个结果就为true,都不来结果才为fasle
代码展示:
public class LogicTest1{
public static void main(String[] args){
System.out.println(false|true);// true
System.out.println(false|false);//false
System.out.println(true|false);// true
System.out.println(true|true);//true
}
}
运行截图:
^异或运算(二元运算符,有四种可能)
结论:两边相同返回false,两边不相同返回true
代码展示:
public class LogicTest2{
public static void main(String[] args){
System.out.println(false ^ true);// true
System.out.println(false ^ false);//false
System.out.println(true ^ false);// true
System.out.println(true ^ true);//fasle
}
}
运行截图:
!非(一元运算符,有两种可能)
结论:取反,!true-->false \!false-->true
代码展示:
public class LogicTest3{
public static void main(String[] args){
System.out.println(!true);// false
System.out.println(!false);// true
}
}
运行截图:
&&短路与(二元运算符,有四种可能)(重点
)
结论:
- 只有两边都为true,结果才为true
- 只要有一边为false,结果就为false
&&与&的相同点:&和&&的执行结结果都相同
&&与&的不同点:
&&:
- 当
左
表达式的结果为fasle
时,那右表达式不会
执行,直接返回左
表达式的结果(false
) - 当
左
表达式的结果为true
时,那右
表达式一定会
执行,并返回右
表达式的结果
&:
- 当
左
表达式的结果为fasle
时,右
表达式依旧会
执行,并直接返回左
表达式的结果(false
) - 当
左
表达式的结果为true
时,那右表达式一定会
执行,并返回右
表达式的结果
代码展示:
public class LogicTest7{
public static void main(String[] args){
int num = 3;
boolean flag = 3>5 && (num=10)>5;
System.out.println(" num = " + num);// num = 3
int num1 = 4 ;
boolean flag1 = 3<5 && (num1=10)>5;
System.out.println("num1 = " + num1);// num1 = 10;
int num2 = 5;
boolean flag2 = 3>5 & (num2 = 10)>5;
System.out.println("num2 = " + num2);//num2 = 10
int num3 = 6;
boolean flag3 = 3<5 & (num3 = 10)>5;
System.out.println("num3 = "+num3);
// num3 = 10
}
}
运行截图:
代码展示:
public class LogicTest{
public static void main(String[] args){
System.out.println(false&&true);// false
System.out.println(false&&false);//false
System.out.println(true&&false);// false
System.out.println(true&&true);//true
}
}
||短路或(二元运算符,有四种可能)(重点
)
结论:
- 只有两边都为false,结果才为false
- 只要有一边为true,结果就为true
|和||的相同点:|和||的执行结结果都相同
||与|的不同点:
||:
- 当
左
表达式的结果为true
时,那·右
表达式不会
执行,并直接返回左
表达式的结果(true
) - 当
左
表达式的结果为false
时,那右
表达式一定会
执行,并返回右
表达式的结果
|:
- 当
左
表达式的结果为true
时,那右
表达式依旧会
执行,并直接返回左
表达式的结果(true
) - 当
左
表达式的结果为false
时,那右
表达式一定会
执行,并返回右
表达式的结果
代码展示:
public class LogicTest7{
public static void main(String[] args){
int num = 3;
boolean flag = 3>5 || (num=10)>5;
System.out.println(" num = " + num);// num = 10
int num1 = 4 ;
boolean flag1 = 3<5 || (num1=10)>5;
System.out.println("num1 = " + num1);// num1 = 4;
int num2 = 5;
boolean flag2 = 3>5 | (num2 = 10)>5;
System.out.println("num2 = " + num2);//num2 = 10
int num3 = 6;
boolean flag3 = 3<5 | (num3 = 10)>5;
System.out.println("num3 = "+num3);
// num3 = 10
}
}
运行截图:
代码展示:
public class LogicTest1{
public static void main(String[] args){
System.out.println(false||true);// true
System.out.println(false||false);//false
System.out.println(true||false);// true
System.out.println(true||true);//true
}
}
练习:
-
判断一个数是否在[4,6)之间
代码展示:
// 1. 导包 import java.util.Scanner; public class LogicTest8{ public static void main(String[] args){ //2 . 实例化Scanner对象 Scanner input = new Scanner(System.in); int num = 0; while(true){ System.out.print("请输入一个数:"); // 3. 调用方法 num = input.nextInt(); if(num >= 4 && num < 6){ System.out.println(num + "在[4,6)之间"); }else{ System.out.println(num + "不在[4,6)之间"); } } } }
运行截图:
-
判断一个数是否在(4,6]之外
代码展示:
// 导包 import java.util.Scanner; public class LogicTest9{ public static void main(String[] args){ // 实例化Scanner对象 Scanner input = new Scanner(System.in); int num = 0; for(;;){ System.out.println("请输入一个整数:"); // 调用方法 num = input.nextInt(); if(num >= 6 || num < 4){ System.out.println(num + "在(4,6]之外"); }else{ System.out.println(num + "不在(4,6]之外"); } } } }
运行截图:
补充知识:如何表示一个区间范围的数??
[]代表包含,取得到
()代表不包含,取不到
如:
- [4,6)获取4至6之间的所有整数,但不包含6
- [4.0,6.0)获取4.0至6.0间的所有小数,包含4.0,不包含6.0
位运算
包含:>> 、<<、<<<、^、&、|
若左右两边是数值,做的就是位运算
若左右两边是boolean类型,做的是逻辑运算
&与位运算(二元运算符)
结论:
- 若两个位都为1,结果才为1
- 若两个位中有一个为0,那结果就为0
代码展示:
public class OperationTest65{
public static void main(String[] args){
int num = 7 & 8;
System.out.println("num = " + num);
}
}
画图分析:
运行截图:
|或位运算(二元运算符)
结论:
- 若两个位都为0,结果才为0
- 若两个位中有一个为1,结果就为1
代码展示:
public class OperationTest66{
public static void main(String[] args){
System.out.println(3|5);
}
}
画图分析:
运行截图:
^异或位运算(二元运算符,重点
)
结论:两个位相同则为0,两个位不相同则为1
特点:对m连续异或n两次,返回结果是m本身
代码展示:
public class OperationTest08{
public static void main(String[] args){
System.out.println(1 ^ 2 ^ 2);
}
}
画图分析:
运行截图:
异或的使用场合:
-
常用于加密操作
模拟:服务端给客服端传递一个加密的数值
加密:服务端把需传输的数值异或一个数(m)
解密:客服端把得到的数继续异或m,就可得到解密后的数值
-
实现两个变量值的交换
代码展示:
public class OperationTest01{
public static void main(String[] args){
System.out.println(9^1);
}
}
画图分析:
运行截图:
~非位运算(一元运算符)
结论:位取反,1–>0, 0–>1
代码展示:
public class OperationTest02{
public static void main(String[] args){
System.out.println(~1);
}
}
画图分析:
运行截图:
<<左移位运算(重点
)
结论:对m右移n位,等效于m乘以2的n次方
注意:不管操作的是正|负数,左移后,移除高位,低位补0
使用场合:对一个数乘以2,可通过左移一位来实现
代码展示:
public class OperationTest03{
public static void main(String[] args){
System.out.println(6 << 1);
}
}
运行截图:
画图分析:
>>
右移位运算(重点
)
结论:对m右移n位,等效于m除以2的n次方
注意事项:正数右移高位补0,负数右移低位高位补1
使用场合:对一个数除以2,可通过右移一位来实现
代码展示:
public class OperationTest09{
public static void main(String[] args){
System.out.println(3 >> 1);
}
}
画图展示:
运行截图:
>>>
无符号右移
注意:无论对正数还是负数无符号右移运算,高位永远补0
代码展示:
public class UnsignRightMove{
public static void main(String[] args){
System.out.println(7>>>1);
}
}
画图分析:
运行截图:
三目运算符(重要
)
语法:条件表达式?表达式1:表达式2
注意:"?"和“:”都是英文状态下下符号
执行:当“条件表达式”为true时,执行表达式1,否则执行表达式2
练习:
-
判断两个数中的最大值
代码展示:
// 方式一: public class FindMax{ public static void main(String[] args){ int num = 2,num1 = 5,max = 0; if(num > num1){ max = num; }else{ max = num1; } System.out.println("最大值为Max = "+ max); } }
运行截图:
代码展示:
public class FindMax01{ public static void main(String args[]){ int num = 1,num2 = 2,max = 0; max = num > num2 ? num : num2; System.out.println("最大值max = "+max); } }
运行截图:
运算符的优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、% . | 从左到右 |
2 | !、+(正)、-(负)、~、++、– | 从右到左 |
3 | *、% | 从左到右 |
4 | +(加)、-(减) | 从左到右 |
5 | << 、>> 、>>> | 从左到右 |
6 | <、<=、>、>= | 从左到右 |
7 | == 、 != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ?: | 从右到左 |
14 | =、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<、>>、>>>== | 从右到左 |
小白注意:先乘除,后加减,若不懂就用小括号
此文章于11月22日编辑完毕,小编也是个初学者,或许有些内容写的有错误的,我对自己的要求是:有错改之,无错加勉。还望大家能在评论区指点迷津,不胜感激,同时也希望大家口下留情!!