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) 这一节就到这里吧,下节再说。
';