运算符
java语言支持如下运算符
- 算术运算符+, -, *, /, %, ++, –
- 赋值运算符=
- 关系运算符>,<,>=, <=, ==, !=, instanceof
- 逻辑运算符&&, ||, !
- 位运算符&, |, ^, ~, >>, <<, >>>(了解)
- 条件运算符?:
- 扩展赋值运算符+=, -=, *=, /=
IDEA快捷键:复制当前行到下一行ctrl+D
-
- 下面开始分类讲解:
算术运算符 | +, -, *, /, %, ++, – |
---|---|
赋值运算符 | = |
关系运算符 | >, <, >=, <=, ==, !=, instanceof |
运算举例
package operator;
public class Demo01 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
int d = 40;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a/(double)b);
}
}
计算结果
30
-10
200
0
0.5
注意:
观察到a/b得到0, 原因是两个int除完得到0.5
由于结果是int型,将0.5int 所以得到了0
举例
public class Demo01 {
public static void main(String[] args) {
long a = 123367484858697079L;
int b = 66;
short c = 30;
byte d = 4;
System.out.println(a+b+c+d);
System.out.println(b+c+d);
System.out.println(c+d);
}
}
结果
123367484858697179
100
34
注意到如果使用了
System.out.println((String)(c+d));
系统报错无法将int转换成String
注意:所有计算,如果没有更高级别的类型比如double/float/long,默认为int类型
比如byte+short,在计算里就会将结果按照int来算
比如你让byte+short计算强制转换String,就会报错can not cast int into String
知识点++a和a++
a=3
b=++a;
相当于先把a+1运算做了,再赋值给b
两行运算完毕a=4,b=4
a=3
b=a++;
相当于先把赋值运算作了,再给a+1
两行运算完毕a=4,b=3
程序举例
public static void main(String[] args) {
int a=3;
int b=a++;
System.out.println(a);//a=4
System.out.println(b);//b=3
int c=++a;//c=a+1=5;a=5
System.out.println(a);//a=5
System.out.println(c);//c=5
}
运行结果
4
3
5
5
除了++运算,还有–运算,他们是一模一样的
幂运算
可以借助Math.XXX完成一些常见的数学运算,比如幂指数(即就是多少次方的运算)
注意这里的Math是大写。
Math.pow(doube_a,double_b)
//这里的pow就是表示Math.power,计算的是a^b,注意a,b至少有一个数需要是double
程序举例
public class Demo02 {
public static void main(String[] args) {
int a = 4;
double b = 5;
System.out.println(Math.pow(a,b));
}
}
运行结果
1024.0
逻辑运算符 | &&, ||, ! |
---|---|
条件运算符 | ?: |
扩展赋值运算符 | +=, -=, *=, /= |
&&,||,!举例
public static void main(String[]args){
boolean a = true;
boolean b = false;
System.out.println("a&&b="+(a&&b));//false
System.out.println("a||b="+(a||b));//true
System.out.println("!a="+(!a));//false
System.out.println("!(a||b)="+!(a||b));//false
System.out.println("!(a&&b)="+!(a&&b));//true
}
结果输出:
a&&b=false
a||b=true
!a=false
!(a||b)=false
!(a&&b)=true
短路运算
这个意思是如果一个运算,计算到前面部分已经出了结果,后面的部分就直接不算了
public static void main(String[] args) {
int c=5;
boolean d= (c<4)&&(++c>4);//c<4得到false,后面的就不计算了
System.out.println(c);//因为c<4得到false,++c没有被计算,所以c还是5
System.out.println(d);//d为false
}
5
false
位运算符 | 位运算符 &, |, ^, ~, >>, <<, > >> (了解) |
---|
异或(A^B):相同为0,不同为1
<< 左移一位并且补充上来0,相当于原来的数乘2
相应的,右移一位,最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
System.out.println(2<<3);
就是2向左挪动3位,补上来的是0,运算结果是16
问题:位运算符的>>>什么意思?
>>>
是一个无符号右移运算符(Unsigned Right Shift Operator)。
当你使用普通的右移运算符 >> 对一个负数进行右移时,Java会保持其符号位(即最高位)不变,这被称为“算术右移”。这意味着负数在右移后可能仍然保持为负数。
相反,无符号右移运算符 >>> 会将所有位都向右移动,而不考虑符号位。它会在左边插入零,而不是复制符号位。因此,无论操作数是正数还是负数,>>> 都会在其左侧插入零。
int a = -4;
// 在二进制中表示为: 11111111111111111111111111111100
int b = a >> 1;
// 算术右移: 11111111111111111111111111111110 (仍然是负数)
int c = a >>> 1;
// 无符号右移: 01111111111111111111111111111110 (变成了正数)
计算结果:
System.out.println(b); // 输出 -2
System.out.println(c); // 输出 2147483646
在这个例子中,-4 在进行算术右移后变成了 -2,因为它保持了符号位。但是,在进行无符号右移后,它变成了 2147483646,这是因为所有位都向右移动,并且在左侧插入了零。
+=和 -=符号
a+=b;//这句的意思就是a=a+b
类似的 a-=b//这句的意思就是a=a-b
举例
int a=5;
int b=3;
int s=a+b;
System.out.println("a+b="+s);
a+=b;//a=a+b
System.out.println("a="+a);//a=8
System.out.println("b="+b);//b=3
System.out.println("a="+a);//a=8
a+b=8
a=8
b=3
a=8
字符串连接符+
在System.out.println(xxx)时,只要出现了+符号,并且+前面是String类型,
也就是说String+组合,系统就会把+旁边的元素都转化成String类型输出
举例
public class Demo04 {
public static void main(String[] args) {
int a=10;
int b=30;
System.out.println("(a+b)="+(a+b));
//a+b作为整体 先用int+int计算完毕了 再和字符(a+b)=拼接
System.out.println("a+b="+a+b);
//“a+b=”作为一个字符串,后面跟着两个字符串拼接符号+
System.out.println(""+a+b);
//首先遇见空字符串和拼接符号,且后面不是整体的int等类型,一项一项拼接,得到1030
System.out.println(a+b+""+1);
//首先遇到int加int,计算完毕后遇见了字符串拼接符号,拼接空得其本身,为String40,再拼接1,为401
}
输出
(a+b)=40
a+b=1030
1030
401
三元运算符
x?y:z
如果x为真,则结果为y,否则结果为z
举例
public static void main(String[] args) {
int score=80;
String m= (score>60) ? "及格" : "不及格";
System.out.println(m);
}
及格
java运算符优先级
简单说 单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
举例
public static void main(String[] args) {
int a=1427;//010110010011,2623₈ = 1427₁₀ = 593₁₆
int b=6;//0110
System.out.println(a>>+b);
//这里面级别高的+b其实就是0+b,计算完毕结果还是6,然后给a右移6位,得到010110即就是22
System.out.println(b);
System.out.println(a);
}
计算结果
22
6
1427
如果上面的例子没看懂,下面有详细解释:
public class test_jan{
public static void main(String[] args) {
int a=1427;//010110010011,2623₈ = 1427₁₀ = 593₁₆
int b=6;//0110
System.out.println(a>>+b);
//这里面级别高的+b,等于b=0+b,计算完毕结果还是6,然后给a右移6位,得到010110即就是22
//注意:++b b++ 和 +b是完全不一样的
System.out.println("b="+b); //b等于6
System.out.println("+b="+(+b));//b=0+b;所以现在b是6
System.out.println("++b="+(++b));//b=1+b;立刻赋值给b,所以现在b=7
System.out.println("b++="+(b++));//b直接赋值b,然后再加一,所以这一行的值是7,但是b已经变成8了
System.out.println("b="+b);
System.out.println(a);
}
}
运行结果
22
b=6
+b=6
++b=7
b++=7
b=8
1427