3-运算符
一级目录
二级目录
三级目录
1 算术运算符
+,-,*, / 、% 、++ 、 –
1.1 +号
- 正数
- 加号
- 连接符号
System.out.println(+20); // 表示 正数
System.out.println(3+4); // 两数相加
System.out.println("Hello" + 666); // 拼接
1.2 - * / %
System.out.println(5-3); // 2
System.out.println(-3); // -3
System.out.println(5*3); // 15
System.out.println(5/3); // 1
System.out.println(5%3); // 2
System.out.println(2%4); // 2
System.out.println(5/(double)3); // 1.666667
System.out.println((double)5/3); // 1.666667
1.3 ++/–
++ – 属于单目运算
++ 表示自增1
– 表示自减1
单独使用
表示自增或者自减,没有任何的区别
public static void main(String[] args)
{
int a = 10;
int b = 20;
// a = 10 b = 20
System.out.println("a = " + a + " b = " + b);
//a ++;
//b --;
// a = 11 b = 19
//System.out.println("a = " + a + " b = " + b);
++ a ;
-- b ;
// a = 11 b = 19
System.out.println("a = " + a + " b = " + b);
}
参与运算
- 如果++放在操作数的左边,就表示先自增再参与运算
- 如果++放在操作数的右边,就表示先参与运算然后在自增1或者自减1
// ++ -- 参与运算
int a1 = 3;
int a2 = 4;
int result = (a1++)/3 + (--a2)*2 -(a1--)%6 + (a2++)*3 - (a2--);
System.out.println("a1=" + a1 + " a2="+a2 + " result="+result);
课堂练习:
- int x = 3; int res = (x++)%(++x) 请推断res的值,及x此时的值
- int n = 5; n=++n + ++n 求n的值
- int n = 3; n= ++n + n ++;求n的值
2 赋值运算符
普通的 =
扩展的 += -+ *= /= %=
public static void main(String[] args)
{
// 赋值运算符 这个不是==赋值语句
int a = 10 ; // 表示将常量10赋值给变量a地址所对应的内存区域中
a += 3; //等价于a = a + 3
System.out.println(a);
a -= 3; // 等价于 a = a - 3;
System.out.println(a);
}
面试题1
: short s1 = 1 ; ? s1 = s1 + 1; 有什么错?
short s1 = 1; s1 += 1; 又有什么错?
short s1 = 1;
s1 = s1 + 1; // 报错 需要强制类型转换
s1 += 1; // 不会 += 会帮助我们自动完成强制类型转换
面试题2
:如何交换两个数?
int x = 10;
int y = 20; // 互换x和y的值
int c = x;
x = y;
y = c;
解决方案:声明一个中级变量即可
3 关系运算符
> < >= <= != ==
关系运算符得到的结果都是boolean类型的数据(true和false)
public static void main(String[] args)
{
int a = 10;
int b = 20;
System.out.println(a > b) ; // false
System.out.println(a < b) ; // true
System.out.println(a >= b) ; // false
System.out.println(a <= b) ; // true
System.out.println(a != b) ; // true
System.out.println(a == b) ; // false
}
4 逻辑运算符
连接多个boolean类型的表达式
boolean类型的表达式1 boolean类型的表达式2 boolean类型的表达式3 boolean类型的表达式4
4.1 位逻辑运算符
二进制运算
按位与(&):两边都是1才是1,其他都是0(有0为0)
按位或(|):两边都是0才是0,其他都是1(有1为1)
异或(^):两边不同为1,同为0(同0异1)
public static void main(String[] args)
{
int a = 10;
int b = 20;
// 按位 & 都为true 结果 true
System.out.println((a > b ) & (a < b)) ; // false & true = false
System.out.println((a < b ) & (a > b)) ; // true & false = false
System.out.println((a < b ) & (a < b)) ; // true & true = true
System.out.println((a > b ) & (a > b)) ; // false & false = false
System.out.println("----------------------------");
// 按位 | 有true 就为true
System.out.println((a > b ) | (a < b)) ; // false | true = true
System.out.println((a < b ) | (a > b)) ; // true | false = true
System.out.println((a < b ) | (a < b)) ; // true | true = true
System.out.println((a > b ) | (a > b)) ; // false | false = false
System.out.println("----------------------------");
// 按位 异或 相同为false 不同为true
System.out.println((a > b ) ^ (a < b)) ; // false ^ true = true
System.out.println((a < b ) ^ (a > b)) ; // true ^ false = true
System.out.println((a < b ) ^ (a < b)) ; // true ^ true = false
System.out.println((a > b ) ^ (a > b)) ; // false ^ false = false
}
按位符号也会运用在位运算
,位运算操作要比普通运算的效率要高很多
&:有0取0,否则取1
1001 & 0110 = 0
1 0 0 1
& 0 1 1 0
----------
0 0 0 0
|:有1取1,否则取0
1001 | 0110 = 15
1 0 0 1
| 0 1 1 0
----------
1 1 1 1
^:相同为0 不同为1
1001 ^ 0110 = 15
1 0 0 1
^ 0 1 1 0
----------
1 1 1 1
4.2 短路逻辑运算符
&& 短路与
|| 短路或者
! 非
& 表示按位与,无论什么情况都会同时计算运算符两边的表达式
&& 表示短路与,如果前面的表达式为false,那么无论后面的表达式结果如何,都不会去计算后面表达式的值。因为后面表达式的值不会影响结果
同时注意:在实际使用中我们很少使用按位与,更多的是使用短路与
!:取反
当!的个数是奇数个的时候,结果相反
当!的个数是偶数的时候,结果不变
`面试题:& 与 && 的区别
- & 表示按位与,无论什么情况都会同时计算运算符两边的表达式
- && 表示短路与,如果前面的表达式为false,那么无论后面的表达式结果如何,都不会去计算后面表达式的值。因为后面表达式的值不会影响结果
- && 开发中使用,&基本不使用
- &常用与位运算操作,效率高
5 位运算符
位运算符:用来计算二进制的运算符
& | ^ ~
有符号移动:<< >>
无符号移动:>>> 、<<<
eg:4>>1,结果为2
6条件运算符
条件运算符又称为三目运算
格式: X ? Y : Z ;
X 表达式必须是boolean类型的表达式
计算流程:
1. 首先计算X的值
2. 如果X为true,那么整个表达式的结果就是Y的值
3. 如果X为false,那么整个表达式的结果就是Z的值