运算符
算数运算符
+
//数字,字符串
-
*
/
% //取余:11%9=2
++与– –
前加加,先运算后取值
后加加,先取值后运算
关系运算符
relational operator
结果都是布尔值
==
!= //不等
<>=结合操作
位运算符
举个例子吧
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011
我们仔细看下最后一个~的运算
这个需要兄弟们学习补码原码反码的知识
我只简单说下原理吧
e.g
我们算~4
先写出他的原码:0000 0100
再取反 1111 1011
减一 1111 1010
负数的反码等于原码除了符号位以外的全部位取反加,补码等于反码加一(所以反码=补码-1)
取反 1000 0101
所以返回-5
总结一下:
正数是先直接取反运算,再转原码取值。
负数是先转原码,在进行取反运算取值。
这个先有个大致概念吧,等练习的时候会有深入讲解的。
逻辑运算符
这个和高中讲的逻辑电路一样的道理
如果家人们高中没好好学习,可以看下下面的解释:
&& (且) 当且仅当两个操作数都为真,条件才为真。
|| (或) 如果任何两个操作数任何一个为真,条件为真。
! (非) 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false
是不是非常简单,不过还有一个我们必须了解的短路逻辑运算符
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
条件运算符(?:)
该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量
public class Test {
public static void main(String[] args){
int a , b;
a = 2;
b = (a == 1) ? 20 : 30;
//if a = 1则b 为 20,否则为 30
System.out.println(b);
>>>30
b = (a == 2) ? 20 : 30;
//if a = 2则b 为 20,否则为 30
System.out.println(b);
>>>20
}
}
基本数值类型转换
自动转换
byte b = 10;
int a =20;
byte c;
c= a + b;
error:Incompatible types. Found: 'int', required: 'byte'
他告诉我们: 不兼容的类型: 从int转换到byte可能会有损失
如果两个值不一致,会自动将小类型转化为大类型
强制转换
当然,我们也可以进行强制转换
e.g
byte b = 10;
int a =20;
byte c;
c= (byte)[a + b];
这样就不会报错了。
是不是很简单
but 真的这么简单吗?
我们输入以下代码
byte b = 10;
int a =200;
byte c;
c= (byte)[a + b];
然后运行出来发现结果竟然是-46!!!
为什么捏?简单来说,byte只能储存8位机器数值,但是210显然远远超过了其可存的最大值,因此,就值取了后八位
那么,为了避免强制转换所带来的风险
我们一般使用int,long类型来进行操作
long b = 10;
long a =200;
long c;
c= (long) (a + b);
System.out.println(c);
>>>210
这样输出的就是正确的值了。