1、 运算符、操作符:
1) 算数运算符:+ - * / % ++ --
A) byte、short在运算时会自动提升为int
B) double 和 float在计算过程中不保证精度,会产生舍入误差(绝大部分小数转换为二进制时无法精确表示)
C) java是一门强类型的语言,只有一种类型的数据参与运算,结果还是原类型
D) 整数/0 -> ArithmeticException 。非0小数/0或者非0数字/0.0 ----à +/-Infinity
0/0.0或 0.0/0 或0.0/0.0-> NaN --- Not a Number
E) %取模运算符-7%3= -1 -25% 7 = -4 7%-3 = 1
整数取余规律:在做取余运算时,先忽略两个数字的符号,然后再算,看左边的数字的符号,左边为正,结果为正,左边为负,结果为负。 3.5% 2 = 1.5; 5.5%1.8 = 0.1 -5%1.7 = -1.6
F) ++ -- : 放在前面和后面是有区别的++在前先自增在运算,++在后,先参与后续运算,再自增
G) 特殊类型:byte b = 3 ; b++; 是可以的
【注意:字符可以参与运算,自动提升为int类型,结果是int类型,byte short char可以进行++ 和 -- ,是可以保留原类型,类型不变,因为底层还是int来算的,然后在转换回来iadd,自增, i2b,强转】
1) 赋值运算符: = += -= *= /= %= 位运算: &= |= ^= <<= >>= >>>=
int i= 5;
i +=i -= i*= 5; i = 5+(5-5*5); //从左到右开始走
i += i-= i*= ++i; i =5+(5-5*6)= -20; i += i-= i* = i++; i = -15;
i =5; i= i++; i=5;
除了= 外,其余运算符由于有了附属操作,要求变量先初始化才能运算
byte/ short 可以参与复合赋值运算【底层会强转, i2b,强转】
2) 关系运算符:> < >= <= == !=
3) 逻辑运算符:用于运算逻辑值或者布尔值的
&与---and | 或---or 非算路与非短路或 !非---not
^异或 --- xor t^t = f f^t = t t^f = t f^f = f(两边相同为假,两边不同为真)
&& || 短路与和短路或
【注意:】短路与和短路或中,短路或可以短路掉短路与。可是短路与不能短路掉短路或(和优先级没关系)
4) 位运算:注意:位运算针对整数的补码进行运算
任何数据在计算机内存中存储的是其补码,其运算也是针对其补码。正数原反补一致,负数补码是原码的基础上取反,最高位不变,然后再加1
byteb = 100 ; b += 100;
int类型计算:00000000 00000000 0000000001100100
00000000 00000000 00000000 01100100
int2byet转换结果:11001000 补码转原码 -----56
七个:& | ^ << >> >>> ~
&:将数据转化为补码,然后按位相与,再将结果转化为十进制显示{正数与任何数都是正数,负数与负数才是负数}
小用途:用于判断奇偶性 数& 1 = 1-à奇数 数&1 = 0-à偶数
| :或运算:同上{负数或任何数都是负数,正数或正数才是正数}
^ : 异或:按位异或{ a ^ b ^a = b---符合交换律 = 0 ^ b = b}
用途:交换两个数的值
异或法:i = i^j ; j=i^j; j = i ^ j; <------ > i^ =j ; j ^= i ; i^ = j;(限制针对整数)
<<:左移运算符: 左移补0,高位舍弃 3<<2 = 12 5<<3 =40
【在一定范围内,向左移动几位,就乘以二的几次方,在左移位运算的时候,移动的位数,实际不是直接计算要移动的位数,而是先取余32,然后移动取余32后的余数----3<<32 = 3 <<(32%32) = 0移动0位】
>>:右移:补码右移,低位次舍弃,高位正补0,负补1【9>>2 = 2】右移正数越来越小,负数越移越大,最大到-1 右移几位,除以2的几次方
>>>无符号右移:右移补0,负数右移变正数
~:取反运算:不管高低位,一律0变1 , 1 变0 ~3 = -4
【对i取反,~ i = -i-1】
int i= 3 ; i = ~ i++; //-4 先去取反运算 , i的值为 4 ,-4赋值给i
int I= 4; i+=i-=i*=~i++; //40
5) 三元运算: 布尔表达式?结果1 : 结果2结果为true执行1,否则执行2
三元表达式,有具体的结果,有一个变量来接住最终的结果,前后两个结果类型一致或者能够转化double d = 5>3? ‘a’: 2.5*3.4; //可以进行类型转化,可以形成嵌套