Java运算符
java运算符
目录
3.关系运算符(主要有六个:==\!=\<\>\<=\>=)
1.运算符介绍
运算符(对操作数进行操作时的符号,不同运算符操作的含义不同) | |
算术运算符 | 基本四则运算符:+ - * / % 增量运算符:+= -= *= %= 自增/自减运算符:++ -- |
关系运算符 | 主要有六个:==\!=\<\>\<=\>= |
逻辑运算符 | 主要有三个:&&、||、! |
位运算符 | 主要有四个:&、|、~、^ |
移位运算符 | <<、>>、>>> |
条件运算符 | 表达式1?表达式2:表达式3 |
2.算术运算符
2.1 基本四则运算符(加减乘除模)
注:
- 都是二元运算符,使用时必须有左右两个操作数
代码2-1:
public class Test {
public static void main(String[] args) {
int a = 20;
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);//模运算相当于数学中除法的余数
}
}
运算结果如下:
- 下面看几个注意事项:
①int/int=int,并且会向下取整
代码2-2:
int a = 5;
int b = 2;
System.out.println(a/b);
看运行结果:
按照我们的数学逻辑来算,这个结果本应该是2.5,那么为什么在Java中会输出2.5呢?
这是因为会向下取整,即小数点之后全部被舍弃掉了。
那么如何才能得到2.5呢?
代码2-3:
int a = 5;
int b = 2;
double c = a*1.0/b;
System.out.println(c);
此时的运行结果即为2.5
②做除法和取模时,右操作数不能为0(这也是我们在数字中常说的分母不为0)
代码2-4:
int a = 4;
int b = 0;
System.out.println(a/b);
System.out.println(a%b);
运行时系统报错,无法计算
③%不仅可以对整形取模,也可以对double取模,但没有意义
代码2-5:
System.out.println(11.5%2.0);//1.5
④两侧操作数类型不一致时,向类型大的提升
代码2-6:
System.out.println(1+0.2);
1是int类型,0.2是double类型,在相加之前int被提升为double类型。
2.2 增量运算符(+= -= *= %=)
注:
- 只有变量才能使用该运算符,常量不能使用
代码2-7:
int a = 2;
a+=3;//a=a+3=5
System.out.println(a);
a-=1;//a=a-1=4
System.out.println(a);
a*=5;//a=a*5=20
System.out.println(a);
a/=2;//a=a/2=10
System.out.println(a);
a%=3;//a=a%3=1
System.out.println(a);
看运行结果:
2.3 自增/自减运算符(++ --)
- ++是给变量的值+1
- --是给变量的值-1
代码2-8:
int a = 1;
a++;//后置++,表示a的值+1,此时a=2
System.out.println(a++);//先输出a的值,再++//此时a=2
System.out.println(a);//3
int b = 2;
++b;//前置++,表示b的值+1,此时b=3
System.out.println(++b);//先++,再输出b//此时b=4
System.out.println(b);//4
注:
- 若单独使用,【前置++】和【后置++】无区别
- 只有变量才能使用自增/自减运算符,常量不可使用,因为常量不允许被修改
3.关系运算符(主要有六个:==\!=\<\>\<=\>=)
计算结果为true或者false
代码3-1:
int a = 10;
int b = 20;
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);
运行结果如下:
注:
- 当需要进行多次判断时,不能连着写,例如:3<5<7,java程序中的运算与数学中的有区别
4.逻辑运算符(主要有三个:&&、||、!)
注:
- 语法规则:逻辑与&&和逻辑或||——左右表达式必须是boolean类型的结果
逻辑非——!表达式
- 运算结果都为boolean类型
4.1 逻辑与&&
&&相当于数学逻辑运算中的且(一假即假)
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
代码4-1:
int a = 1;
int b = 2;
System.out.println(a==1&&b==2);//true
System.out.println(a==1&&b>8);//false
System.out.println(a>5&&b==2);//false
System.out.println(a>6&&b>7);//false
4.2 逻辑或||
||相当于数学逻辑运算中的或(一真即真)
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
代码4-2:
int a = 1;
int b = 2;
System.out.println(a==1||b==2);//true
System.out.println(a==1||b>3);//true
System.out.println(a!=1||b==2);//true
System.out.println(a!=1||b>3);//false
4.3 逻辑非!
真变假,假变真
表达式 | 结果 |
真 | 假 |
假 | 真 |
代码4-3:
int a = 1;
System.out.println(!(a==1));//false
System.out.println(!(a!=1));//true
4.4 短路求值
代码4-4:
System.out.println(10>20 && 10/0==0);
System.out.println(10<20||10/0==0);
看此代码的运行结果:
??我们都知道,10/0会使程序抛出异常,那么为什么此代码能正常运行呢?
这是因为:对于&&,如果左侧值为false,一假即假,结果就为false,程序并不会计算右侧表达式
对于||,如果左侧值为true,一真即真,结果也就为true了
注:
&和|如果表达式结果为boolean时,也表示逻辑运算,但它们并不支持短路求值
比如代码4-5:
System.out.println(10>20 & 10/0==0);
System.out.println(10<20|10/0==0);
运行结果如下:
—— 程序抛出异常
5.位运算符(主要有四个:&、|、~、^)
- ~是一元运算符,|、&、^是二元运算符
- 位操作表示:按二进制位运算
5.1 按位与&
如果两个二进制位都是1,则结果为1,否则为0
代码5-1:
int a = 10;//00001010
int b = 20;//00010100
System.out.println(a&b);//00000000
运行结果如下:
5.2 按位或|
如果两个二进制位都是0,则结果为0,否则为1
代码5-2:
int a = 10;//00001010
int b = 20;//00010100
System.out.println(a|b);//00011110
运行结果如下:
注:
- 当&和|的操作数为整数(int、short、long、byte)时,表示按位运算
- 当操作数为boolean时,表示逻辑运算
5-3 按位取反~
如果该位为0.则转为1;如果该位为1,则转为0
代码5-3:
int a = 0xf;
System.out.printf("%x\n",~a);// \n是换行符
运行结果如下:
注:
- 0x前缀的数字为十六进制数字,十六进制可以看成是二进制的简化表示方式,一个十六进制数字对应4个二进制位
- 0xf表示10进制的15,也就是二进制的111
- printf能够格式化输出内容,%x表示按照十六进制输出
5-4 按位异或^
如果两个数字的二进制位相同,则结果为0,相异则结果为1
如果两个数相同,则异或的结果为0
代码5-4:
int a = 0x1;
int b = 0x2;
System.out.printf("%x\n",a^b);
运行结果如下:
6.移位运算符(<<、>>、>>>)
<<、>>、>>>都是二元运算符,且都是按照二进制比特位来运算的
6.1 左移<<
- 最左侧位不要了,最右侧补0
- 向左移位时,丢弃的是符号位,因此正数左移可能会变成负数
代码6-1:
int a = 10;//0000 1010
System.out.println(a<<1);//0001 0100 //20
6.2 右移>>
- 最右侧位不要了,在左侧补符号位(正数补0,负数补1)
代码6-2:
int a = 10;//0000 1010
System.out.println(a>>1);//0000 0101 //5
6.3 无符号右移>>>
- 最右侧位不要了,最左侧补0
代码6-3:
int a = 10;//1000 1010
System.out.println(a>>>1);//0000 0101 //5
注:
- 左移一位,相当于原数字*2,相当于原数字*2的n次方
- 右移一位,相当于原数字/2,相当于原数字/2的n次方
- 由于计算机计算移位效率高于计算乘除,当某个代码正好乘除2的n次方的时候可以用移位运算代替
- 移动负数位或者移位位数过大都没有意义
- 没有无符号左移
7.条件运算符(表达式1?表达式2:表达式3)
- 表达式1为真,执行表达式2,否则执行表达式3
- 是Java中唯一的一个三目运算符,是条件判断语句的简化写法
代码7-1:
int a = 1;
int b = 2;
int max = a>b?a:b;
System.out.println(max);
运行结果如下:
注:
①表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
代码7-2:
int a = 1;
int b = 2;
int c = a>b?1:2.0;
System.out.println(c);
运行结果如下:
②表达式不能单独存在,其产生的结果必须要被使用
代码7-3:
int a = 10;
int b = 20;
a>b?a:b;
运行结果如下:
8.运算符的优先级
在一条表达式中,如果运算符的优先级没有弄清楚,可能会造成很大的麻烦
代码8-1:
int a = 2;
int b = 20;
int c = a + (b-a)>>1;
System.out.println(c);
运行结果如下:
在上述表达式中,+的优先级高于>>,所以先做加法,结果为20,最后再进行右移,所以最终结果为10
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)