优先级
最高的优先级:小括号,即( )
最低的优先级:赋值运算符,即=
优先级顺序:!>算术运算符>比较运算符>&&>||
算数运算符
+ - * / % ++ --
注意事项:
①整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型只需要把操作的数据中任意的一个数据变为浮点数
System.out.println(x*1.0/y);
②如果在程序中,要改变运算顺序,可以使用()。
例:
(1)int x=4270;
x = x / 1000 * 1000
结果为4000,因为4270/1000=4.27,但是默认int类型,所以变成4
(2)面试题:1 % 5=1 -1 % 5 =-1
结论:不考虑百分号右边是否带负号,都正常取余
(3) 15/2=7 //除法
15%2=1 //取余数
15.0/2=7.5
(4) 0/整数会产生一个异常
0/浮点数=无穷大或NaN
++和–的用法
a:他们的作用是自增或者自减
b:使用
**单独使用
放在操作数据的前面和后面效果一样。
a++或者++a效果一样。
**参与操作使用
放在操作数的前面:先自增或者自减,再参与操作
放在操作数的后面:先参与操作,再自增或者自减
例:
int a = 3;
int b = 4;
//int c = a++;
//int d = b--;
int c = ++a;
int d = --b;
System.out.println("a:"+a); //4, 4
System.out.println("b:"+b); //3, 3
System.out.println("c:"+c); //3, 4
System.out.println("d:"+d); //4, 3
int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c--;
//请分别计算出a,b,c的值
a=9 b=10 c=8
int x = 4;
int y = (x++)+(++x)+(x*10);
请分别计算出x,y的值
//y=4+6+60
//x=5,6
赋值运算符
= += -= *= /= %=等
①+= 把左边和右边做加法,然后赋值给左边。
②=叫做赋值运算符,也是最基本的赋值运算符
int x = 10; 把10赋值给int类型的变量x。
③扩展的赋值运算符的特点
隐含了自动强制转换。
面试题:
(1) short s = 1;
s = s + 1;
(2) short s = 1;
s += 1;
请问上面的代码哪个有问题?
答:都没有问题,扩展的赋值运算符其实隐含了一个强制类型转换。
s += 1;不是等价于 s = s + 1;而是等价于 s = (s的数据类型)(s + 1);
关系运算符
> < == != >= <= &(与) |(或) ^(非)
特点:无论运算符两端简单还是复杂最终结果是boolean类型。
结论:
-
&:有false则false
-
|:有true则true
-
^:相同则false,不同则true。一个数据对另一个数据位异或两次,该数本身不变。
int a = 10; int b = 20; System.out.println(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20 !:非true则false,非false则true
&与&&之间的区别
&&:结果和&是一样的,只不过有短路效果。左边是false,右边不执行。
||:结果和|是一样的,只不过有短路效果。左边是true,右边不执行。
>>>与>>的区别
·>>>运算符会用0填充高位, >>则不会这样做。 不存在<<<运算符
位运算符
<< 左移 左边最高位丢弃,右边补齐
·>> 右移 最高位是0,左边补齐0;最高为是1,左边补齐1
·>>> 无符号右移 无论最高位是0还是1,左边补齐0
& 任何二进制位和0进行&运算,结果是0。和1进行&运算结果是原值。
| 任何二进制位和0进行 | 运算,结果是原值。和1进行 | 运算结果是1。
^ 任何相同二进制位进行 ^ 运算,结果是0。不相同二进制位 ^ 运算结果是1。
为什么要用>>(右移)和<<(左移)?
因为:比乘除法运算效率更高
例题
1、把<<左边的数据乘以2的移动次幂
System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
2、把>>左边的数据除以2的移动次幂
System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
System.out.println(24 >>> 2);
System.out.println(-24 >> 2);
System.out.println(-24 >>> 2);
3、计算出3的二进制:11
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100
4、>>的移动:
计算出24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00) 补码
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果:-6
5、>>>的移动:
计算出24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
结果:1073741818
注意:要做位运算,首先要把数据转换为二进制(补码形式)。
面试题
- 请实现两个整数变量的交换
class OperatorTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b);
方式1:使用第三方变量(开发中用的)
int c = a;
a = b;
b = c;
System.out.println("a:"+a+",b:"+b);
System.out.println("------------");
方式2:用位异或实现(面试用)
左边:a,b,a 右边:a ^ b
a = a ^ b;
b = a ^ b; //a ^ b ^ b = a
a = a ^ b; //a ^ b ^ a = b
System.out.println("a:"+a+",b:"+b);
2:请用最有效率的方式计算出2乘以8的结果
2<<3
三元运算符
A:格式
比较表达式?表达式1:表达式2;
B:比较表达式:结果是一个boolean类型。
C:执行流程:
首先计算比较表达式的值,看是true还是false。
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
D:案例:
class OperatorTest {
public static void main(String[] args) {
//获取两个整数中的最大值
int x = 100;
int y = 200;
int max = (x > y? x: y);
System.out.println("max:"+max);
System.out.println("--------");
//获取三个整数中的最大值
int a = 10;
int b = 30;
int c = 20;
//A:先比较a,b的最大值
//B:拿a,b的最大值在和c进行比较
int temp = ((a > b)? a: b);
int max1 = (temp > c? temp: c);
System.out.println("max1:"+max1);
//比较两个整数是否相同
int m = 100;
int n = 200;
//boolean flag = (m == n)? true: false;
boolean flag = (m == n);
System.out.println(flag);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117457.html