Day03
一、运算符
1.算数运算符
+、-、*、/、%、++、–
经典面试题一:(部分代码)
int a = 8;
int b = (a++)+(++a)+(a*10);
System.out.println(b);
输出结果为118
经典面试题二:(部分代码)
int i = 0 ;
i = ++i;
System.out.println(i);
输出结果为1
底层实现:i = (int)(i+1); i=i;
int i = 0;
i = i++;
System.out.println(i);
输出结果为0
底层实现:int temp = i; i = (int)(i+1); i = temp;
2.赋值运算符
=、+=、-=、*=、/=、%=
经典面试题一:(部分代码)
int a,b;
a = b = 100;
System.out.println(a);
System.out.println(b);
输出结果为100
100
经典面试题二:(部分代码)
short s=1;
s = s+1;
System.out.println(s);
结果: 会报错误: 不兼容的类型: 从int转换到short可能会有损失
在此情况中,做赋值运算前会先将s+1默认为int类型,从而导致编译出错,可以用强制转换来避免,但是要注意待转换的值的大小是否在目标所属数据类型的取值范围中,若不在,则可能会产生与期望所不符合的结果。
short s=1;
s += 1;
System.out.println(s);
结果:2
+=是java的赋值运算符,有特殊处理。
3.关系运算符
==、!=、>、 <、 >=、 <=
关系运算符的结果都是boolean类型,只有true或者false这两种结果。
经典面试题一:(部分代码)
int x = 10;
int y = 10;
boolean flag = (x == y);
System.out.println(flag);
输出结果为true
经典面试题二:(部分代码)
boolean b1 = true;
boolean b2 = false;
boolean b3 = (b1 == b2);
System.out.println(b3);
boolean b4 = (b1 = b2);
System.out.println(b4);
输出结果为false false
4.逻辑运算符
&(与)、&&(短路与)、|(或) 、||(短路或)、!(非)、^(异或)
规则:
& 和 && 规则:两个有一侧为false,结果为false
| 和 || 规则 :两侧有一侧为true,结果为true
^ 规则:两侧相同为false,不同为true
!规则:置反,false变成true , true变成false
注意:
逻辑运算符运行结果都是boolean类型,&、&&、|、||、^ 两侧都应该是boolean类型数据。
5.三目运算符/三元运算符
操作符: ? :
语义:布尔表达式?结果1:结果2
当表达式结果为真,获得结果1,若结果为假,则获得结果2
例题1(部分代码)
int a=5;
System.out.println("a="+((a<5)?10.9:9));
结果:9
例题2(部分代码)
char x='x';
int i=10;
System.out.println(false?i:x);
System.out.println(false?100:x);
结果:120 x
第一个结果中,i是int类型,在运算false?i:x时,会将字符类型x转换为int类型。第二个结果中,没有存在这种情况。
6.字符拼接符与位运算符
字符拼接符:+(当此符号两侧中有任意一方为字符串时,是字符拼接符,否则是算术运算符)
位运算符: & 、 |、 ^ 、 <<、 >>、 >>>
&、|、^:前后两者都是boolean值,此符号为逻辑运算符
&、|、^:前后两者都是数值,此符号为位运算符
对位运算符的一些简单理解:(部分代码)
byte a = 23;//0001,0111
byte b = 14;//0000,1110
//同位比较,两者都为1,结果为1(对应的二进制位置上的数值,纵向对比)
//0000,0000,0000,0000,0000,0000,0001,0111 -- int类型的23(比较时会上升到int类型进行比较也就是32位)
//0000,0000,0000,0000,0000,0000,0000,1110 -- int类型的14
//0000,0000,0000,0000,0000,0000,0000,0110 -- int类型的6
//0000,0110 -- byte类型的6 (a & b)的结果
byte result = (byte)(a & b);
System.out.println(result);//6 - 0000,0110
//同位比较,两者任意一方有1,结果为1
System.out.println(a | b);//31 - 0001,1111
//同位比较,不同有1,相同为0
System.out.println(a ^ b);//25 - 0001,1001
//<<左移:整体向左移动n位,就用n个0补位
byte b = 8;//0000,1000
//0010,0000(b<<2运算后的二进制结果)
System.out.println(b << 2);//32
//>>右移:整体向右移动n位,就用n个最高位补位
byte b1 = 8;//0000,1000
//0000,0010
System.out.println(b1 >> 2);//2
byte b2 = -8;//1111,1000
//1111,1110
System.out.println(b2 >> 2);//-2
//>>>无符号位右移:整体向右移动n位,就用n个0补位
byte b1 = 8;//0000,1000
//0000,0010
System.out.println(b1 >>> 2);//2
byte b2 = -8;//1111,1000
//001111,1111,1111,1111,1111,1111,1111,10
System.out.println(b2 >>> 2);//会输出1073741822(比较特殊的例子)
7.表达式与运算符的优先级别
5+6:算数表达式
5>6:关系表达式
5|6:位运算表达式
运算符的优先级别如图:(不必硬记,灵活运用小括号即可)