【JavaSE04】Java中的运算符

一、算数运算符

如上图所示,基本和数学中的算术运算符没有什么太大的区别,不做过多介绍。不过有几点需要注意:

  • 取模运算符:

    • 模数负号忽略不记,如:5%-2=1。

    • 被模数是负数则不可忽略,结果的符号与被模数的符号相同。

    • 取模运算的结果不一定总是整数。

int m1 = 12;
int n1 = 5;
System.out.println("m1 % n1 = " + m1 % n1);

int m2 = -12;
int n2 = 5;
System.out.println("m2 % n2 = " + m2 % n2);

int m3 = 12;
int n3 = -5;
System.out.println("m3 % n3 = " + m3 % n3);

int m4 = -12;
int n4 = -5;
System.out.println("m4 % n4 = " + m4 % n4);

System.out.println("13.5%5="+(13.5%5));//13.5%5=3.5 
  • 除号“/”:

    • 整数之间做除法时,只保留整数部分而舍弃小数部分。

    • 除数、被除数只要存在浮点数,则结果为浮点数。

int num1 = 12;
int num2 = 5;

int result1 = num1 / num2;
System.out.println(result1);//2

int result2 = num1 / num2 * num2;
System.out.println(result2);//10

double result3 = num1 / num2;		System.out.println(result3);//2.0

double result4 = num1 / num2 + 0.0;//2.0
double result5 = num1 / (num2 + 0.0);//2.4
double result6 = (double)num1 / num2;//2.4
double result7 = (double)(num1 / num2);//2.0
System.out.println(result5);
System.out.println(result6);
  • “+”除字符串相加功能外,还能把非字符串转换成字符串.例如: System.out.println(“5+5=”+5+5);的打印结果是? 5+5=55 ?

  • 前++和后++(--同)

    • 前++ :先自增1,后运算。

    • 后++ :先运算,后自增1。

    • ++不会改变本身变量的数据类型。

// x++的形式  
int x=4;  
int y=(x++)+5;  
System.out.println("x="+x+",y="+y);//x=5,y=9  
//++x的形式  
x=4;  
y=(++x)+5;  
System.out.println("x="+x+",y="+y);//x=5,y=10  
//x--的形式  
x=4;  
y=(x--)+5;  
System.out.println("x="+x+",y="+y);//x=3,y=9  
//--x的形式  
x=4;  
y=(--x)+5;  
System.out.println("x="+x+",y="+y);//x=3,y=8  

short s1 = 10;
s1 = s1 + 1;//NG
s1 = (short)(s1 + 1);//OK
s1++;//OK,自增1不会改变本身变量的数据类型
System.out.println(s1);

//问题:
byte b1 =127;
b1++;
System.out.println("b1 = " + b1);

二、赋值运算符

基本赋值运算符:“=”,从右往左运算,左边不能是常量,支持连续赋值。

当 “=” 两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。

复合赋值运算符:+=、-=、*=、/=、%=;

注意:

  • +=,-=,/=,*=,%= 运算结果的数据类型和左侧变量的数据类型不一致,隐藏强制类型转换不会改变左侧变量的数据类型

  • 整数常量只要不超出所赋值的整数变量的取值范围,可以直接赋值,内部隐藏强制类型转换。

short s = 3;
//s = s+2;//编译不通过
s += 2; //5

int i = 1;
i *= 0.1;
System.out.println(i);//0
i++;
System.out.println(i);//1

int n1 = 10;
n1 += (n1++) + (++n1);
System.out.println(n1);//32

三、比较运算符(关系运算符)

运算符 运算 范例 结果
== 相等于 4==3 false
!= 不等于 4!=3 true
< 小于 4<3 false
> 大于 4>3 true
<= 小于等于 4<=3 false
>= 大于等于 4>=3 true
instanceof 检查是否是类的对象 “Hello” instanceof String true

注意:

  • 比较运算符的结果都是boolean型,也就是要么是true,要么是false。

  • 比较运算符“==”不能误写成“=” 。

boolean b1 = false;
//区分好==和=的区别。
if(b1==true)//结果为假
	System.out.println("结果为真");
else
	System.out.println("结果为假");

boolean b1 = false;
//区分好==和=的区别。
if(b1=true)//结果为真
	System.out.println("结果为真");
else
	System.out.println("结果为假");

四、逻辑运算符

&:逻辑与

|:逻辑或

!:逻辑非

&&:短路与

||:短路或

^:逻辑异或

a b a&b a&&b a|b a||b !a a^b
true true true true true true false false
true false false false true true false true
false true false false true true true true
false false false false false false true false

注意:

  • 逻辑运算符的操作数都是boolean类型

  • “&”和“&&”的区别:

    • 单&:左边无论真假,右边都进行运算;

    • 双&时:如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

  • “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。

  • “&”和“&&”,“|”和“||”运算结果相同

int x1 = 1,y1 = 1;
if(x1++==2 & ++y1==2){
	x1 = 7;
}
System.out.println("x1="+x1+",y1="+y1);//x1=2,y1=2
int x2 = 1,y2 = 1;
if(x2++==2 && ++y2==2){
	x2 =7;
}
System.out.println("x2="+x2+",y2="+y2);//x2=2,y=1
int x3 = 1,y3 = 1;
if(x3++==1 | ++y3==1){
	x3 =7;
}
System.out.println("x3="+x3+",y3="+y3);//x3=7,y3=2
int x4 = 1,y4 = 1;
if(x4++==1 || ++y4==1){
	x4 = 7;
}
System.out.println("x4="+x4+",y4="+y4);//x4=7,y4=1

五、位运算符

位运算:直接对整数(位运算符操作的都是整型数据)的二进制进行的运算。

运算符 运算 范例 说明
<< 左移 3 << 2 = 12 空位补0,被移除的高位丢弃,空缺位补0。在一定范围内,每左移1位,相当于*2
>> 右移 3 >> 1 = 1 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。在一定范围内,每右移1位,相当于/2
>>> 无符号右移 3 >>> 1 = 1 被移位二进制最高位无论是0或者是1,空缺位都用0补。
& 与运算 6 & 3 = 2 二进制位进行&运算,只有1&1时结果是1,否则是0;
| 或运算 6|3 = 7 二进制位进行|运算,只有0|0时结果是0,否则是1;
^ 异或运算 6 ^ 3 = 5 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
~ 取反运算 ~6 = -7 正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反

例1:交换两个变量的值

//练习:
int num1 = 10;
int num2 = 20;
System.out.println("num1 = " + num1 + ",num2 = " + num2);

//方式一:定义临时变量的方式
//推荐的方式
int temp = num1;
num1 = num2;
num2 = temp;

//方式二:好处:不用定义临时变量  
//弊端:① 相加操作可能超出存储范围 ② 有局限性:只能适用于数值类型
//num1 = num1 + num2;
//num2 = num1 - num2;
//num1 = num1 - num2;

//方式三:使用位运算符
//有局限性:只能适用于数值类型
//num1 = num1 ^ num2;
//num2 = num1 ^ num2;
//num1 = num1 ^ num2;
System.out.println("num1 = " + num1 + ",num2 = " + num2);

例2:求一个0~255范围内的整数的十六进制,如60的十六进制表示是3C

//方式一:自动实现
String str1 = Integer.toBinaryString(60);
String str2 = Integer.toHexString(60);

//方式二:手动实现
int i1 = 60;
int i2 = i1&15;
String j = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
int temp = i1 >>> 4;
i2 = temp & 15;
String k = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
System.out.println(k+""+j);

六、三目运算符

格式:布尔表达式:表达式1?表达式2

说明:当布尔表达式值为true时,返回表达式1的值否则返回表达式2的值;表达式1和表达式2类型一致

三元运算符与if-else的联系与区别:

  1. 三元运算符可简化if-else语句。

  2. 三元运算符要求必须返回一个结果。

  3. if后的代码块可有多个语句。

//获取两个数中的较大数
int m = 12;
int n = 5;
int max = (m > n)? m : n;
System.out.println(max);
//获取三个数中的较大数
int n1 = 12;
int n2 = 30;
int n3 = -43;
int max1 = (n1 > n2)? n1 : n2;
int max2 = (max1 > n3)? max1 : n3;
System.out.println("三个数中的最大值为:" + max2);

七、运算符优先级

运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符总优先于下一行。

运算方向 运算符
. () {} ; ,
R→L ++ -- ~ !(data type)
L→R * / %
L→R + -
L→R << >> >>>
L→R < > <= >= instanceof
L→R == !=
L→R &
L→R ^
L→R |
L→R &&
L→R ||
R→L ? :
R→L = *= /= %=
+= -= <<= >>=
>>>= &= ^=

只有单目运算符、三元运算符、 赋值运算符是从右向左运算的。

 

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/javase/basic-grammar/1859/java_operator/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录