5.运算符
表达式:是由操作数和符号组成的式子
操作数:变量、常量和字面量
变量,在后续的使用过程中,可以随时更改它的值
常量,被final修饰的变量,值一旦确定,就不可更改(java中常量一般用纯大写)eg:final int b = 10;
字面量,按照字面意思理解的量,不可更改 eg:1 true 'a'
优先级:算术运算符>关系运算符>逻辑运算符 (!取反的优先级 > ()括号的优先级)
( & > || )
eg:if(!(year % 2 == 0)) 若为if(!year % 2 == 0) // !year报错 !优先级比括号高
(1)算术运算符
+、-、*、/、%(取余)
如果参与除法运算的都是整数型,那么就是取整运算(结果只取整数位)
如果有浮点型参与除法运算,就是正常的除法运算
四则运算中,计算结果的数据类型和参与运算中表数范围最大的类型一致
%取余数
范围小于int的变量(byte、short)进行四则运算之后的结果的类型为int
eg:byte s = 2;
byte s1 = 3;
short s2 = s + s1; //报错
short s2 = (short)(s + s1); //short自动转int
eg:System.out.println(-5 % -2); //商2余-1
System.out.println(-5.5 % 2); //商2余-1.5
System.out.println(-5.5 % -2); //商2余-1.5
(2)复合运算符
一个运算符是由=和其它运算符组成的(可以自动转类型)
+= -= *= /= %=
使用复合运算符时,自动转换类型,不用我们自己转换类型
eg:short s0 = 1;
s0 += 1; //s0 = (short)(s0 + 1),可自动转换int
s0 = s0 + 1; //s0 + 1为int,s0之前定义short,比int小,需强转
(3)自增自减
自增++ 自减--:在变量原有的基础上 加1或者减1
不论自增符号在变量之前还是之后,该变量本身肯定加1
如果参与其它运算,如果++在前,先给本身自增1,然后参与其它运算
如果++在后,先参与其它运算,然后再给本身自增1
eg:int i = 10;
int j = i++ + ++i * --i;
运算: 10 + 12 * 11 j=142
i最终: 11 12 11 i=11
(4)关系运算符
>、<、>=、<=、==、!=(不等于)
关系运算的结果肯定是布尔值
eg:boolean result = 10 == 3; //false
(5)逻辑运算符
&&(与)、||(或)、!(非)
逻辑运算的结果肯定是布尔值
逻辑运算符只能连接结果为布尔值的表达式
&&(短路与):连接的表达式中只要有一个表达式结果为假,整体表达式的结果就为假;
有假即为假
区别:如果某个表达式的结果已经是false了,后面与连接的表达式就不再执行;
逻辑运算率高;
&(通路与):如果某个表达式的结果已经是false了,后面与连接的表达式继续执行(&的运算结果与&&一致)
逻辑运算率低;
还是位运算符
eg:result = 10 >a && a > 3; //之前定义a=10
(java中关系式不能连续用 eg:10>a>3 从左到右——10>a的结果与3比较,不符合规范)
||(短路或):连接的表达式中只要有一个表达式结果为真,整体表达式的结果就为真;
有真即为真 当某个表达式的结果为true时,后面或连接的表达式就不再执行
|(通路或):当某个表达式的结果为true时,后面或连接的表达式继续执行
eg:result = 10 > 20 || 7 > 3 || a++ > 8; //true a++ > 8不执行
!(非,结果为布尔值的表达式):取反操作,表达式结果为true,取反之后就为false
eg:result = !true; //false
eg:result = a > 5 == true; //== true写法多余,不推荐 一般写作!(a > 5);等同于a <= 5;
(6)位运算符
&(按位于)、|(按位或)、^(异或)、<<(左移)、>>(右移)、~(按位取反)
先将参与运算的数字都转换成二进制,然后按位计算
&:有0即为0
eg:5&2
5 101
2 010
000
|:有1即为1
^(异或):相同即为0,不同即为1
异或的特点:
1.相同为0,不同为1;
2.任何数字异或上0,结果为还是该数字 a ^ 0 = a
3.任何数字异或上本身,结果为0 a ^ a = 0
4.异或符合交换律 a ^ b = b ^ a
5.异或符合结合律 (a ^ b) ^ c = a ^ (b ^ c)
<<(左移)、>>(右移) (高位补0,低位舍弃)
m左移了n位,m << n; 结果为m乘以2的n次幂
m右移了n位,m >> n; 结果为m除以2的n次幂
<< 表示左移移,不分正负数,低位补0
>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
>>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
eg:2如何快速变成8 2 × 4 = 8——2 × 2的2次幂——2左移两位
8如何快速变成2 8右移两位
eg:r = 3 << 33;
//由于r = 3 << 32;后为3本身,故该题等同于r = 3 << 1;为6(溢出为1个圈,左出右进)
~(按位取反):(按位取反对所有位进行操作,包括符号位)
原码:数字转换成二进制之后的二进制数
反码:原码按位取反就得到了反码
补码:反码加1就得到了补码
负数在计算机中是以补码的形式存储 负数的反码 = 它的原码符号位不变,其他位取反;
负数的补码 = 它的反码 +1;
正数的原码、反码、补码相同
0没有正负之分(无符号位 0000 0000)
对正数取反:~n 得到的结果就是 -(n+1)
对负数取反:~-n 得到的结果就是 n-1
eg:1原码 0000 0001 1
取反之后的结果 1111 1110 -2
eg:-2原码: 1000 0010
-2反码: 1111 1101
-2 补码: 1111 1110
~ -2 == ~1111 1110 == 0000 0001 1
(7)三目运算符
结果为布尔值的表达式? 值1:值2
当表达结果为true时,三目运算符的结果为 值1
当表达结果为false时,三目运算符的结果为 值2
eg:10 > 100 ? 1 : 9; //结果为9