2.8 运算符
最后更新于:2022-04-01 14:10:15
这一节我们来学习java语言中的运算符。
Java语言支持如下运算符:
算术运算符:+,-,*,/,%,++,--
关系运算符:>,<,>=,<=,==,!=
逻辑运算符:!,&,|,^,&&,||
位运算符:&,|,^,~,>>,<<,>>>
赋值运算符:=
扩展赋值运算符:+=,-=,*=,/=
字符串连接运算符:+
我们直接看例子吧:
先看一下算术运算符。
~~~
class OperateDemo
{
public static void main(String[] args)
{
//算术运算符 + - * / %(取余,模运算) +(连接符)
// ++ (自增:就是在原有基础上加一,再赋给原有数据) --
int x = 6370;
x = x / 1000 * 1000;//结果是6000,也就是说java是强制运算语言
System.out.println(x);
//取模运算主要用于开关算法的定义
System.out.println(3 + 2);//加法
System.out.println("3" + 2);//String连接符
System.out.println("5 + 5 =" + 5 + 5);//5 + 5 =55
System.out.println("5 + 5 =" + (5 + 5));//5 + 5 =10
int a = 4,b = 5;
System.out.println("a:" + a + ",b:" + b);//a:4,b:5
int a1 = 3,b1;
//a1 ++;//相当于a1=a1+1;
//b1 = a1++;//a1=4,b1=3 这个过程是先把a的值留存在一个临时空间内,然后在原空间进行++运算并将结果存进去,然后把临时空间的值赋给b
b1 = ++a1;//a1=4,b1=4 这个过程中先进行++运算,并把结果赋给a,再把a的值赋给b
System.out.println("a1="+a1+",b1="+b1);//a1=4,b1=4
int i = 3;//更加清晰的反映了这个过程
i = i++;
System.out.println("i="+i);//i=3
int j = 3;
j = ++j;
System.out.println("j="+j);//j=4
}
}
~~~
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c417080c1d.jpg)
再看符值运算符
~~~
class OperateDemo2
{
public static void main(String[] args)
{
//赋值运算符 = += -= *= /= %=
int a,b,c;
a = b = c = 4;
int a1 = 4;
a1 += 2;//a1 = a1 + 2;
short s = 3;//赋值,s是两个字节,3是四个字节,自行检测
//s += 4;//这个在底层做了自动转换
//s = s + 4;//这个报错,缺失精度,不能自动转换,把int类型存入short中
s = (short)(s + 4);//等价于s += 4;
System.out.println("s="+s);
}
}
~~~
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c417097151.jpg)
比较运算符
~~~
class OperateDemo3
{
public static void main(String[] args)
{
//比较运算符 > < == >= <= != instanceof(是不是实例)
//比较运算符,运算要么为真,要么为假,true or false
System.out.println(3>2);//true
/*逻辑去处符 &(与) |(或) ^(异或) !(非) &&(双与) ||(双或)
x > 2 && x < 5 等价于 2<x<5
逻辑运算符是用于连接两个boolean类型的表达式
&:符号的去处特点:
true & true = true;
true & false = false;
false & false = false;
false & true = false;
&:运算规律:
运算的两边只要有一个是false,结果一定为false;只有两边同为true,结果才为true
|:运算特点:
true | true = true;
true | false = true;
false | false = false;
false | true = true;
|:运算规律:
去处两过只要有一个是true,结果为true;只有两边都为false,结果才为false
^:异或:和或有点不一样.
^:运算特点:
true | true = false;
true | false = true;
false | false = false;
false | true = true;
^:运算规律:
两边的结果相同,结果为false;两边的结果不同,结果为true.
!:运算特点:!true = false; !false = true;
&&和||可以短路运算
&&:当左边为false时,右边不再参与运算
||:当左边为true时,右边不再参与运算
*/
int x = 3;
System.out.println(x>2&x<5);
System.out.println(x<2|x>5);
}
}
~~~
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c4170ace00.jpg)
位运算符
~~~
class OperateDemo4
{
public static void main(String[] args)
{
/*
位运算符:二进制
&(与) |(或) ^(异或) ~(去反) <<(左移) >>(右移) >>>(无符号右移)
6 & 3 = 2
0000-0000 0000-0000 0000-0000 0000-0110 6
&0000-0000 0000-0000 0000-0000 0000-0011 3
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0010 2
6 | 3 = 7
0000-0000 0000-0000 0000-0000 0000-0110 6
|0000-0000 0000-0000 0000-0000 0000-0011 3
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0111 7
6 ^ 3 = 5
0000-0000 0000-0000 0000-0000 0000-0110 6
^0000-0000 0000-0000 0000-0000 0000-0011 3
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0101 5
6 ^ 3 ^ 3 = 6:一个数异或同一个数两次,结果还是这个数.
3 << 2 = 12 3 << 3 = 24 //向左移几位,左边的几位就被舍取,右边加几个0
0000000000000000000000000000011 3
0000000000000000000000000001100 12
@左移几位,其实就是该数乘以2的几次方,可以完成2的次幂运算
6 >> 1 =
对于高位出现的高位,原来最高位为0,就用0补位,原来最高位为1,就用1补位
右移几位其实就是该数据除以2的几次方
>>>:无符号右移:数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补.
*/
System.out.println(6 & 3);//6在计算中:0000-0000 0000-0000 0000-0000 0000-0110
System.out.println(6 | 3);
System.out.println(6 ^ 3);
System.out.println(~6);//-7
System.out.println(3 << 2);//左移两位,相当于乘以2的2次方
}
}
~~~
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c4170be7b4.jpg)
三元运算符
~~~
class OperateDemo5
{
public static void main(String[] args)
{
/*
三元运算符:
格式:(条件表达式)?表达式1:表达式2
如果条件为true,运算表达式1
如果条件为false,去处表达式2
*/
int x = 3,y;
y = (x > 1) ? 100 : 200;
System.out.println("y="+y);
//三元运算符的一个小应用
//获取两个整数中的较大的整数
int x1 = 3;
int y1 = 4;
int max = (x1>y1)?x1:y1;
System.out.println(max);
//获取三个整数中的最大的整数
int o,p,q;
o = 5;
p = 6;
q = 4;
int temp = (o>p)?o:p;
int max1 = (temp>q)?temp:q;
}
}
~~~
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c4170cfb37.jpg)
最后看一个简单的测试就过吧
~~~
class OperateTest
{
public static void main(String[] args)
{
//最有效率的方式算出2乘以8等于几?
System.out.println(2 << 3);
System.out.println(8 << 1);
//对两个整数变量直接互换(不需要第三方变量)
int a = 3,b = 5;
/*
阅读性好,开发时用
int c;
c = a;
a = b;
b = c;
*/
/*
这种方式一般不要用,如果两个整数的数值过大,会超出int范围,会强制转换,数据会变化.
a = a + b;
b = a - b;
a = a - b;
*/
/*
面试时用,可读性差
a = a ^ b;//a = 3 ^ 5;
b = a ^ b;//(3 ^ 5) ^ 5;
a = a ^ b;//(3 ^ 5) ^ 3;
*/
System.out.println("a="+a+",b="+b);
}
}
~~~
结果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c4170e0aaa.jpg)
这一节就到这里吧,下节再说。