Java基本运算
运算符作用:用来进行数据的运算、赋值、比较等操作
1.算数运算:
++:自增
--:自减
①(+ - * /)都是需要两个操作数
② ++ -- 只需要一个操作数
注意:++ -- 只能够应用于变量,不能用于常量
不管++、--在前或在后,最后改变量的值都会自增或自减
++: 如果在前表示先自增再赋值,如果在后表示先赋值再自增辅助: i++ 先赋值给i++ 然后再自增1
++i 先自增1给++i 再赋值(i++ 和 ++i可看成一个运算式,每一个人理解不一样,我口语也表达不清楚,有点绕脑壳,反正就比如:int i = 3; i++现在等于3,然后程序由上到下执行完i++这一步之后下一个i等于4 )
int i = 2;
System.out.println("i:"+i);//2
System.out.println("i++:"+i++);//表示①将 i的值直接赋值给i++ 这个整体;②将i的值+1,最后i变成+1后的值
System.out.println("i:"+i);//3
System.out.println("++i:"+ ++i);//表示①将 i的值+1后赋值给++i 这个整体;②最后i变成+1后的值
System.out.println("i:"+i);//4
可以将i++看成一个表达式
2.赋值运算:( = += -= *= /= %= )
注意:把= += -= *= /= %=看成是一个符号,= 优先级最低
ex: int i = 2;
i +=5; // 7 ==》 i=(int)i+5 默认有个转换
3.比较运算:== != > < >= <=
instanceof:面向对象用,判断类型是否属于,即一个数据是否是某种类型,仅用于引用数据类型,不能用于基本数据类型
int a = 5;
System.out.println(a instanceof int); // 错误:这是基本数据类型
String str = “helllo”;
System.out.println( str instanceof String); //true
4.逻辑运算(LogicalOperators) :两边必须是布尔值
逻辑运算符有如下:
&&: 逻辑双与 表示并且的关系 同true为true,否则为false,有短路功能,且逻辑运算效率高于&,当左边的结果值为false时短路
& : 逻辑单与 表示并且的关系 同true为true,否则为false,有位运算的功能
|| : 逻辑双或 表示或者的关系 同false为false,否则为true,有短路功能,且逻辑运算效率高于|,当左边的结果值为true时短路
| : 逻辑单或 表示或者的关系 同false为false,否则为true,有位运算的功能
^ : 异或 两边不一样结果true,否则为false。同假异真
! : 逻辑非 把true变成false 把false变成true。非真即假,非假即真,作用于一个条件
逻辑运算符的优先级: ! > &&(&) > ||(|)ex: System.out.println(true || true && false); // true
|、& 与 ||、&&的区别:(看两边类型)
① &&、|| 只能是逻辑运算
【 特点:还具有短路行为(如果左边的条件能确定整个表达式的结果值,右边的条件将不再进行运算,即可提高执行效率,&&:左边为false短路,||:左边为true短路) 】
② &、| 可以是逻辑运算符,也可以是位运算符
短路验证:
方法①: 可以在右边使用一些自增的语句,从结果来看值的变化
int i = 1;
System.out.println(false && i++ == 1); //false 判断右边i++
System.out.println(i); //1
System.out.println(false & i++ == 1); //false
System.out.println(i); //2
=======================================
int i = 1;
System.out.println(true || i++ == 1); //true
System.out.println(i); //1
System.out.println(true | i++ == 1); //true
System.out.println(i); //2
方法②:右边部分中包含一个错误(异常) ex:除0
System.out.println(5<0 && 5/0>0);//在这里5/0会报错,左边为false,&&短路将不再执行右边
5.位运算:(按照数字的二进制位进行操作 了解就行)
1. & 两个位都为1 结果为1 否则0。同一为一
3 & 5
0011
& 0101
------
0001 ->1
2. | 只要有一位为1 结果 1。有一即一
3 | 5
0011
| 0101
------
0111 ->7
3. ^ 1-0 0-1 结果都为1 否则为0.同0异1;
3 ^ 5
0011
^ 0101
------
0110 ->64. ~ 按位取反 1--》0 0--》1 作用于单个条件
~3
将该数字+1后,前面加上负号(-)
5. << 把二进制位向左移动,如果最高位是0,那么后面补0,如果是1,那么 补1
3<<2 有溢出风险
0011 在没有溢出的前提下,结果就是将该数字 *2^n ,n表示移动位数
------- 如果溢出的话,会以二进制进位
1100 -》12
6. >> 把二进制位向右移动,如果最高位是0,那么后面补0,如果是1,那么 补1
3>>2
0011 3 在没有溢出的前提下,结果就是将该数字 /2^n ,n表示移动位数
------- 如果溢出的话,会以二进制进位
0000 -》0
7. >>> 无符号向右移动,不管前面最高位是0还是1,右边永远补0,所有负数的无符号右移,没有数学意义
3>>>2
0011 3
-----
0000 0
ex:
public static void main(String[] args) {
System.out.println(3&5);//1
System.out.println(3|5);//7
System.out.println(3^5);//6
System.out.println(~3);//-4
System.out.println(~-4);//3
System.out.println(3<<2);//12
System.out.println(3>>2);//0
System.out.println(3>>>2);//0
System.out.println(-3>>2);//-1
System.out.println(-3>>>2);//1073741823
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);//5
System.out.println(b);//3
}
6.三目运算(三元运算): X ? Y : Z
X:可以代表是boolean值或布尔表达式,或者运算结果为boolean值只有true/ false
如果X为true,那就执行Y值,若不为true就执行Z
ex: System.out.println(3 > 2 ? "正确!!" : "错误!! "); //正确
注意: ①如果以变量储存,Y和Z必须返回同种类型
②Y和Z可以是不同的数据类型,但不能用变量接收
③只有当Y和Z数据类型相同时,才能被接收
④可以嵌套使用 (记得嵌套的时候将嵌套的加上() 目的:可读性易懂)
X ? Y : ( a ? b : c)
⑤不能直接单独使用,因为它是一个值