1.1 运算符
1.1.1 运算符的基本概念
1.1.2 赋值运算符
int num = 10; // = 就是赋值符号 自右向左进行运算的 唯一的一个
1.1.3 算数运算符
I、+号
- 当
+
左右两边的操作数有一个是字符串类型(String ""),此时作为连接符号,连接符号的计算方式是将左右两边的操作数拼接成为一个新的字符串。
1+“+”+1+“=”+1+1
=> 1+“+” ==> "1+"
=> "1+"+1+“=”+1+1 => "1+1"+“=”+1+1 => "1+1"+“=”+1+1 => "1+1=”+1+1 => "1+1=11"
// 算数运算符
public class ArithmeticOperator{
public static void main(String[] args) {
// +号
int num = +5; //正号
System.out.println(num);
// 加法运算符
num = 4 + 5;
System.out.println(num);
// 连接符号 输出内容的时候我们希望输出更多的信息
// 计算结束之后的num的值是9
System.out.println("计算结束之后的num的值是" + num);
//System.out.println("hello world"); // "" 多个字符 组成的 串 ---> 字符串 String
// 希望打印出来 1+1=1+1 => 1+1=2
System.out.println(1+"+"+1+"="+(1+1)); //"1+1="
}
}
II、自增 自减
// ++ 和 --
int j = 5;
j--; // 自增1 自减1 没有区别 单独一条语句
System.out.println("j++之后的结果是:"+j);
// 重新给j赋值
j = 5;
int result = ++j;
// int result = j++; j=6 r=5
// int result = ++j; j=6 r=6
System.out.println("当不是单独一条语句的时候:j=["+j+"] 和 result=["+result+"]");
- 单独一条语句,前加 和 后加;前减和后减没有区别;
- 如果不是单独语句
-
- 前加 前减--> 先自增 自减 再运算
- 后加 后减--> 先运算 再自增 自减
1.1.4 扩展运算符
算数+赋值 位+赋值 += -= *= /= %=
// 扩展运算符
public class ExtendsOperator{
public static void main(String[] args) {
// 计算全班所有同学的分数之和
//1:声明同学分数
int zhangScore = 199;
int liScore = 89;
//2:声明一个变量求和
int sumScore = 0;
//3:将一个学生的分数累加到求和变量中
sumScore = sumScore+zhangScore;// sumScore += zhangScore;
sumScore = sumScore+liScore;
System.out.println("累加分数之和是:"+sumScore);
int n = 10;
byte m = 0;
m += n; // => m = m+n
System.out.println("m的结果时:"+m);
}
}
- 优势
-
- 提升开发效率+提升编译效率
- 自动帮助我们做强制类型转换
- 缺点
-
- 不利于阅读
- 什么情况下可以使用扩展运算符
-
- 赋值符号左右两边有同名变量
1.1.5 关系运算符
>
<
>=
<=
==
!=
instanceof
// 关系运算符
public class RelationOperator{
public static void main(String[] args) {
//1: 关系运算符最后的结果是boolean值
int n = 10;
int m = 20;
boolean flag = n>m;
System.out.println(flag);
System.out.println(n>m);
// > < >= <= 无法比较boolean的值
//System.out.println(true > false);
// 两个引用类型 : 复合类型
/*String str1 = "abc";
String str2 = "abd";
System.out.println(str1 > str2);*/
//2: == !=
flag = n != m;
System.out.println(flag);
System.out.println(true == false);
// 两个引用类型 : 复合类型
String str1 = "abc";
String str2 = "abd";
System.out.println(str1 != str2);
//3: instanceof 不能比较基本数据类型 只能比引用类型
// 判定一个变量、值是否属于某个指定的类型
System.out.println(str1 instanceof String);
System.out.println("apple" instanceof String);
//System.out.println(1 instanceof String);
}
}
- 关系运算符最后的结果是boolean值
< >= <=
无法比较boolean的值- == != 所有类型都可以比较
instanceof
不能比较基本数据类型 只能比引用类型,判定一个变量、值是否属于某个指定的类型
1.1.6 逻辑运算符
逻辑运算符的操作数和结果都是一个boolean值
// 逻辑运算符
public class LogicOperator{
public static void main(String[] args) {
// 1: 左右变量的操作数都是boolean类型的值 &有两种身份 一种是逻辑 一种是位
//boolean flag = true & false;
//System.out.println("逻辑&之后的结果是:"+flag);
//System.out.println(1 & 2);
System.out.println("逻辑&运算符的结果结果如下:");
System.out.println(true & true);
System.out.println(true & false);
System.out.println(false & false);
System.out.println(false & true);
System.out.println("逻辑&& 短路与 运算符的结果结果如下:");
System.out.println(true && true);
System.out.println(true && false);
System.out.println(false && false);
System.out.println(false && true);
System.out.println("逻辑|运算符的结果结果如下:");
System.out.println(true | true);
System.out.println(true | false);
System.out.println(false | false);
System.out.println(false | true);
System.out.println("逻辑|| 短路|| 运算符的结果结果如下:");
System.out.println(true | true);
System.out.println(true | false);
System.out.println(false | false);
System.out.println(false | true);
System.out.println("逻辑^ 异或 运算符的结果结果如下:");
System.out.println(true ^ true);
System.out.println(true ^ false);
System.out.println(false ^ false);
System.out.println(false ^ true);
System.out.println("逻辑! 取反 运算符的结果结果如下:");
System.out.println(!true);
System.out.println(!false);
}
}
- &和&& &&的效率高,第一个操作数为false,第二个操作数不参与运算;
- |和|| ||的效率高,第一个操作数为true,第二个操作数不参与运算;
1.1.7 位运算符
//位运算符
public class BitOperator{
public static void main(String[] args) {
// 位运算符是直接基于二进制运算的 所以它的效率高
// 按位&
/*
0011
0100
————————
0000
每位上的值都是1其结果是1 剩余都是0
*/
int ans = 3&4;
System.out.println(ans);
// 按位|
/*
0011
0100
————————
0111
每位上的值只要有1其结果是1 剩余都是0
*/
ans = 3|4;
System.out.println(ans);
// 按位^
/*
0011
0100
————————
0111
相同为0 不同为1
*/
ans = 3^4;
System.out.println(ans);
// 按位~
/*
0 0100
————————
1 1011
符号位一起取反
*/
ans = ~4;
System.out.println(ans);
// 按位>>
/*
N>>M = N/2^M
*/
ans = -16>>2;
System.out.println(ans);
// 按位<<
/*
N<<M = N*2^M
*/
ans = 2<<4;
System.out.println(ans);
// 按位>>> 无符号 基本不用
/*
N<<M = N*2^M
*/
ans = -32>>>3;
System.out.println(ans);
}
}
1.1.8 条件运算符
三目运算符 它可以跟三个操作数,具体格式如下:
表达式1?表达式2:表达式3
- 先计算表达式1的值 如果表达式1的值时true 则整个结果时表达式2的值 反之则是表达式3的值;
// 表达式1?表达式2:表达式3 三目运算符
// 声明两个变量 计算两个数的最大值
int num1 = 20;
int num2 = 30;
// 将num1和num2 中最大的那个数赋值给max变量
//int max = num1>num2?num1:num2;
//System.out.println(max);
// 再声明一个变量 计算三个数的最大值
int num3 = 44;
//max = num3>max?num3:max;
//max = num3>num1>num2?num1:num2?num3:num1>num2?num1:num2;
System.out.println(num3>(num1>num2?num1:num2)?num3:(num1>num2?num1:num2));
// 笔试题
int result = 90>100?90.0:100;
System.out.println(result);
/*int result = 90>100?90:100.0;
System.out.println(result);*/
/*double ans = 90>100?90:100.0;
System.out.println(ans);
double ans = 90>100?90.0:100;
System.out.println(ans);*/
Tips:一定要注意,使用三目运算符的时候第一点:要么接收这个结果的值要么打印结果的值; 第二点:三目运算符的最后两个表达式的类型一定要保证一致,省的出现类型自动转换
1.1.9 优先级
摘录自:运算符优先级_小明喜欢写bug的博客-CSDN博客_运算符优先级
- 不要试图通过优先级来确定程序的执行顺序 (不要相信自己)
- 你希望先要运算的 通过括号括起来 ()
- 单目>双目>三目>赋值
- 算数 > 关系 > 逻辑 > 赋值