一、算数运算符
注意点:
- 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
- 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只 保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x的 结果是?
- “+”除字符串相加功能外,还能把非字符串转换成字符串.例如: System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55 ?
使用例:
int num1=10, num2=5;
int result;//存放结果
//加法
result=num1+num2;
System.out.println(num1+"+"+num2+"="+result);//10+5=15
//字符串连接
System.out.println(""+num1+num2);//105
//减法
result=num1-num2;
System.out.println(num1+"-"+num2+"="+result);//10-5=5
//乘法
result=num1*num2;
System.out.println(num1+"*"+num2+"="+result);//10*5=50
//除法
result=num1/num2;
System.out.println(num1+"/"+num2+"="+result);//10/5=2
//分子分母都是整型时,结果为整除后的结果
System.out.println(13/5);//2
System.out.println("13.0/5"+13.0/5);//13.0/52.6
//求余数
result=13/num2;
System.out.println("13%"+num2+"="+result);//13%5=2
System.out.println("13.5%5="+(13.5%5));//13.5%5=3.5
// -----------------------------------------------
// 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 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。 |
>> | 右移 | 3 >> 1 = 1 | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 |
>>> | 无符号右移 | 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位,相当于*2
- >>在一定范围内,每右移1位,相当于/2
//练习:交换两个变量的值
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);
//-----------------------------------
//求一个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的联系与区别:
- 三元运算符可简化if-else语句。
- 三元运算符要求必须返回一个结果。
- 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 | = *= /= %= |
+= -= <<= >>= | |
>>>= &= ^= |
只有单目运算符、三元运算符、 赋值运算符是从右向左运算的。