Java中的运算符以及其优先级
1. & 和 && 的区别
相同点:& 和 && 都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为真(true)的时候,整个运算结果才为true,否则,只要有一方为false,则结果为false。
不同点:&&还具有短路的功能,即如果第一个的表达式为false的时候,则不会再计算第二个表达式的值。
例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所有不会出现NullPointerException(控制指针异常)(因为当str为null的时候,执行str.equals(“”)时会抛出空指针异常)。
例如:当x=30时;if(x==33&++y)这里即使第一条表达式的值为false,但是还是会执行第二条表达式:(++y),所以这里y会增长,而if(x==33&&++y)这里的y不会增长!
&还可以作做位运算符,当&操作数两边的表达式不是boolean型时,&表示按位与运算。位运算符主要针对二进制;与运算符用符号“&”表示,其使用规律是:两个操作数都为1时,结果才为1,否则结果为0。
public class test {
public static void main(String[] args) {
int a = 7;//7用二进制表示为:00000111
int b = 8;//8用二进制表示为:00001000
//7&8 得到的结果是:00000000 即为十进制的0
System.out.println(a&b);
}
}
这段代码的输出结果为0;
2.位运算?
2<<3;
因为将一个数左移n位,就相当于乘以2的n次方,那么一个数乘以8只要将其左移三位即可。而位运算是CPU直接支持的,效率最高的。
补充:
- <<:左移运算符,num<<1, 相当于num乘以2
- >>:右移运算符,num>>1,相当于num除以2
- >>>:无符号右移,忽略符号位,空位都以0补齐
例如:7<<1 = 14; 7>>1=3
-3>>>1 = 2147483646
反码等于原码取反
补码等于(反码+1)
负数原码等于其正数的补码
十进制 | 3 |
---|---|
原码 | 00000000 00000000 00000000 00000011 |
反码 | 11111111 11111111 11111111 11111100 |
补码 | 11111111 11111111 11111111 11111101 |
十进制 | -3 |
---|---|
原码 | 11111111 11111111 11111111 11111101 |
最后得到的结果是:2147483646
i++和++i
- i++:程序执行完毕后才进行自增
- ++ i: 程序开始执行前进行自增
int i=1;
i+++i++
System.out.println(i);
输出结果是:3
i+++i++ 即 ( i++)+(i++)
示例代码:
package Test_10;
public class Test {
public static void main(String[] args){
int count = 0;
for(int i=0;i<=100;i++){
count = count++;
}
System.out.println(count);
}
}
得到的结果0
for循环外面count=0,循环里面的count=count++;(count的值都等于count值,而后面count自加不影响循环外面count结果);循环count都为0
int i=5;
int s=(i++)+(++i)+(i–)+(–i);
结果:
int s=(i++)+(++i)+(i–)+(–i);
int s = (5)+(++6)+(7–)+(–6)
=5+7+7+5
=24;