更多内容资源,请关注微信公众号“浅谈Java基础”
运算符就是接受一个或多个参数,并生成一个新值。在java中,有以下几种运算符:
算术运算符
赋值运算符
关系运算符
逻辑运算符
位运算符
三目运算符
java的基本算术运算符与其他大多数程序设计语言是相同的。其中包括加号(+)、减号(-)、除号(/,整数除法会直接去掉结果的小数位,而不是得出四舍五入的圆整结果)、乘号()以及取模运算符(%,从整数除法中产生余数)。除此之外,还有一元加(+)减(-)运算符和自动递增(++)递减(–)运算符。
基本算术运算符举例
int a = 12;
int b = 24;
System.out.println("加法运算:" + (a + b));//36
System.out.println("减法运算:" + (a - b));//-12
System.out.println("乘法运算:" + a b);//288
System.out.println("除法运算:" + a / b);//0
System.out.println("取模运算:" + a % b);//12
从上面可以看出,一元减号(-)和加号(+)与二元减号和加号都使用相同的符号。编译器会根据表达式的书写形式自动判断使用的是哪一种
int a = 20;
int b = 18;
int x = -a;
int y = a * (-b);//int y = a * -b; 两个是相等的,
//第二个有时看起来会有点糊涂。
一元减号用于转变数据的符号,说白了就是正负号。
自动递增递减(++)递减(–)运算符是两种不错的快捷运算,递增运算符“++”,意为“增加一个单位”;递减运算符“–”,意为“减少一个单位”。来个例子,假设a是一个int(整数)值,则表达式++a就等价于(a=a+1)。
这两种运算符有两种使用方式,称为“前缀式”和“后缀式”,前缀放在变量或表达式前面,(++a和–a)这种是先进行自身加或减运算,再给其他赋值;对于后缀式,(a–和a++)先给其他赋值,再进行自身运算。
int a = 2;
int b = 1;
int c = --a; // 先自己做了一次自减运算,再将a的值给了c
System.out.println(c);//1
System.out.println(a);//1
int d = b--; // 先将b的值给了d,然后再自己做了一次自减运算
System.out.println(d);//1
System.out.println(b);//0
java中使用“=”作为赋值运算符,为变量指定变量值。
例如:int a=2; String=”aaa”;
另外,在进行赋值操作时,支持简写形式。
例如:x=x+2;可以简写为x+=2;
x=x-2可以简写为x-=2
x=x*2可以简写为x*=2
效果一样,写法不同。
关系运算符是判断两个常量或变量的大小,得出的结果是一个boolean类型的值,即true或false。
有以下六种关系运算符:
等于(==):表示两个数据是否相等,相等即为true,反之false,另外数据类型不相等,但数值相等也会为true;
不等于(!=):判断两个数据不相等,不相等为true,反之false;
大于(>):判断大于号左边的数是否大于右边的数,大于为true,反之false;
小于(<):判断小于号左边的数是否小于右边的数,小于为true,反之false;
大于等于(>=):判断大于等于号左边的数是否大于或等于右边的数,大于或等于为true,反之false;
小于等于(<=):判断小于等于号左边的数是否小于或等于右边的数,小于或等于为true,反之false;
int a = 97;
int b = 97;
char ch = 'a';
System.out.println(a == b);// true
System.out.println(a == ch);// true
System.out.println(a > b);// false
System.out.println(a >= b);// true
逻辑运算符是比较两个布尔类型的值,最后得出的结果也是布尔类型的,即true或false。逻辑运算符有:与(&&)、或(||)、非(!)、异或(^)。
&&:当左右两个值都为true时,返回true,否则返回false
|| :左右两个操作数,有一个为true即为true
! :!true=false
^ :只有当左右都为true或都为false时,返回false,其他的都返回true
int a = 97;
int b = 97;
char ch = 'a';
System.out.println(a == b && a == ch);// true
System.out.println(a >= b ^ a <= b);// false
System.out.println(a > b ^ a < b);//false
System.out.println(a >= b || a > b);// true
另外:“短路问题”
当单个&时左边无论真假,右面都会进行计算。(不短路)
两个&&时,如果左边为真右边参与运算,左边为false,右边不再进行运算。(短路,潜在的性能提升)
在使用位运算符时,必须先把数据转化为二进制,所以此运算符只适用于整数类型的数据。共有七种位运算符:
按位与(&):两个运算数的二进制数进行‘与’运算,如果两个二进制数相应的位都为1,则该位的结果值为1,否则为0。例如11111011&10111110,其结果为10111010
按位或(|):两个运算数的二进制数进行‘或’运算,如果两个二进制数相应的位都为0,则该位的结果值为0,否则为1。例如11111010|10111110,其结果为11111110
按位异或(^):两个运算数的二进制数进行‘异或’运算,如果两个二进制数相应的位相同,则该位的结果值为0,否则为1。例如11111011&10111110,其结果为01000101
按位取反(~):对一个二进制数进行按位取反,即0变1,1变0,~11001100,结果为00110011
左移运算符(<<):操作对象仍是二进制的“位”,按照运算符右边指定的位数将运算符左边的操作数向左移动,右边补0。例如4<<2,4的二进制数为00000100,左移两位得到00010000即为十进制数16。
对于正数,左移就是把<<左边的数据乘2的移动次幂。
“有符号”右移(>>):按照运算符右边指定的位数将运算符左边的操作数向右移动,有符号运算符使用“符号扩展”,若符号为正,在高位插入0,符号为负,在高位插入1。
对于正数,就是把>>左边的数据除以2的移动次幂。10>>1结果为5
无符号右移(>>>):按照运算符右边指定的位数将运算符左边的操作数向右移动,移出的低位舍弃,高位补0。
三目运算符的表达式形式为:
boolean-exp ? value0 : value1
如果boolean-exp(布尔表达式)的结果为true,就计算value0,计算结果为运算符最终的值;如果boolean-exp(布尔表达式)的结果为false,就计算value1,计算结果为运算符最终的值。
与if-else语句比较,这个更简洁
int a = 5;
int b = 3;
//三目运算符
int max1 = (a > b) ? a : b;
System.out.println(max1);//5
//if-else语句
int max2;
if (a > b) {
max2 = a;
} else {
max2 = b;
}
System.out.println(max2);//5
显而易见。
运算符优先级
1 | 分隔符 | . [ ] ( ) , |
2 | 单目运算符 | ++ – ~ ! |
3 | 乘除取模运算 | * / % |
4 |
加减运算符 | + - |
5 |
位移运算符 | << >> >>> |
6 |
关系运算符 | < <= >= |