一、算数运算符
1、基本四则运算
基本四则运算符:+ - * /
细节一:来看一个Java中简单的基本运算:
System.out.println(5 / 2);
System.out.println((float)5 / 2);
System.out.println(5 / (float)2);
System.out.println((float)(5 / 2));
我相信很多人和我一样,在看到这个基本运算的第一瞬间觉得很简单,甚至有些比较牛的小伙伴会不屑于做这种题。这种不予评价。我首先想到的答案是这四个,有没有和我一样的小伙伴,如果有,那么和我一样会出错。
①:2------这个相信都不会出错
②:2.0-----这个时候就会有一样的同学了
③:2.5
④:2.5
可以肯定的是上述的②和④是错的,因为计算机和我们的想法是不同的。下面我们来解析一下:
①:在直接输出的时候如果都是int类型的数据,那么计算的时候也会当做int类型的数据来算,所以答案是2
②:在这个输出语句中,首先是将5转换为float类型,然后才会和int类型的2进行计算,这样得出的结果就会以float类型保存,即答案为2.5
③:该输出与上面类似,括号的优先级高于计算,因此先将2转换为float类型,然后计算,答案为2.5
④:由于有括号的存在,所以先计算5/2,此时的类型为int,答案为2,但是前面有强制转换,因此最终结果是2.0
上述为我踩的第一个坑,看完结果我就觉得自己还是对基本数据类型和强制转换以及隐式转换类型之间的概念并不是很清晰。
接下来是简单的四则运算中需要注意的点:
(1)int/int的结果依然是int。
(2)0是不能作为除数。
(3)%表示取余操作符号(在Java中不仅可以对int类型取余,也可以对double类型取余。)
细节二:取余操作
System.out.println(10 % 3);
System.out.println(10 % -3);
System.out.println(-10 % 3);
System.out.println(-10 % -3);
该输出考验除法运算:
正确结果为:
①:余数为1
②:10除以-3商-3余1
③:-10除以3商-3余-1
④:-10除以-3商3余-1
2、增量赋值运算符
增量赋值运算符有:+= -= *= /= %=
public class Test{
public static void main(String[] args){
int a = 10;
a += 2;
System.out.println(a);// +=操作的结果:12
int b = 10;
b -= 2;
System.out.println(b);// -=操作的结果:8
int c = 10;
c *= 2;
System.out.println(c);// *=操作的结果:20
int d = 10;
d /= 2;
System.out.println(d);// /=操作的结果:5
int e = 10;
e %= 2;
System.out.println(e);// %=操作的结果:0
}
}
输出结果:
12
8
20
5
0
3、自增/自减运算符
自增运算符:++
自减运算符:–
细节三:对于自增和自减运算需要清晰地知道概念,这样在以后编写代码的时候才不会出错。
public class Test{
public static void main(String[] args){
int a = 5;
a++;
System.out.println(a);//①
int b = 8;
System.out.println(b++);//②
System.out.println(++b);//③
int c = 2;
c = c++;
System.out.println(c);//④
}
}
输出结果:
6(①的输出结果,当单独出现++a或者a++的语句,下一次用到的a的值就增加了1。)
8(②的输出结果,后置++的用法总结为:先用后加,即先输出的b的值,然后加1,下一次使用b变量的时候就变为了9。)
10(③的输出结果,前置++的用法为:先加后用,即先增加1然后输出c的值。)
2(④的输出结果,与②的用法相同)
二、关系运算符
关系运算符有:== != < > <= >=
public class Test{
public static void main(String[] args){
int a = 10;
int b = 10;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
}
}
输出结果:
true
false
false
false
true
true
注意事项:关系运算符比较完成后的结果为boolean类型的,因此只有true或者false两种结果。
三、逻辑运算符
1、逻辑与&&
规则:逻辑与两边的表达式都为boolean类型的,并只有两边的表达式都为true时,结果才为true,否则为false
public class Test{
public static void main(String[] args){
int a = 10;
int b = 30;
int c = 20;
System.out.println(a < b && c < b);
}
}
2、逻辑或||
规则:两边操作数只要有一边为true则结果为true,否则为false
public class Test{
public static void main(String[] args){
System.out.println(10 < 20 || 10 > 30);
System.out.println(10 > 20 || 10 > 30);
}
}
输出结果:
true
false
3、逻辑非!
规则:取相反结果
public class Test{
public static void main(String[] args){
System.out.println(!true);
System.out.println(!false);
}
}
输出结果:
false
true
注意事项:上述的逻辑与和逻辑或都遵循短路原则。如果为短路与:从左向右如果有表达式为false则不会向后判断,直接判定整个表达式为false。如果为短路或:从左向右如果有表达式为true同样不会像后判断,判定结果为true。
例如:下面的10/0为错误的,但是可以执行
public class Test{
public static void main(String[] args){
System.out.println(10 > 20 && 10 / 0);
System.out.println(10 < 20 || 10 / 0);
}
}
4、&和|(不推荐使用)
不推荐使用的原则为:不遵循短路原则,即即使判定结果完成,但是依然会往后判定,直到完成所有判定。
四、位运算符
位运算符主要有四个:&、|、~、^
1、按位与&
如果两个数按位与,对应位置的数字都是1,则结果为1,否则为0。
public class Test{
public static void main(String[] args){
int a = 5;
int b = 7;
System.out.println(a & b);
}
}
写二进制检查:
int类型的5的二进制为:0000 0101,7的二进制为:0000 0111
输出结果:
5
2、按位或|
如果两个数按位或,对应位置的数字都是0,则结果为0,否则为1。
以5和7为例:
5和7经过按位或操作后的结果为:7
3、按位取反~
如果该位是0,则变为1;如果该位为1,则变为0。
以5为例:
经过取反操作后的二进制编码为:1111 1010
4、按位异或^
如果两个数字的二进制位相同,则结果为0,不相同则为1。
5和7经过按位异或操作后的结果为:0000 0010 十进制为2。
五、移位运算
移位运算符:<<(左移)、>>(右移)、>>>(无符号右移)
<<(左移):最左侧位丢弃,最右侧补0
>>(右移):最右侧位丢弃,最左侧补符号位(正数补0,负数补1)
>>>(无符号右移):最右侧位丢弃,最左侧补0