1.运算符的分类
按照功能来分,运算符可以分为:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符 (这里暂时不讲)
分类 | 运算符 |
---|---|
算术运算符 | +、-、*、/、%、++、-- |
赋值运算符 | =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、<<<=、|=、^=等 |
比较运算符 | >、>=、<、<=、!=、== |
逻辑运算符 | &、|、&&、||、^、! |
位运算符 | &、|、^、~、<<、>>、>>> |
条件运算符 | (条件表达式)?结果1:结果2 |
Lambda运算符 | 后续进行讲解 |
2.基本运算符的使用
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | b=4; -b | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模(取余) | 7%5 | 2 |
++ | 自增(前):先运算后取值 | a=2;b=++a; | a=3;b=3 |
++ | 自增(后):先取值后运算 | a=2;b=a++; | a=3;b=2 |
- - | 自减(前):先运算后取值 | a=2;b=--a ; | a=1;b=1 |
- - | 自减(后):先取值后运算 | a=2;b=a--; | a=1;b=2 |
+ | 字符串连接 | “He”+”llo” | “Hello” |
3.算术运算符的注意问题
3.1如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
3.2对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如:intx=3510;x=x/1000*1000; x的结果是?
3.3“+”除字符串相加功能外,还能把非字符串转换成字符串.例如:
System.out.println(“6+6=”+6+6); //打印结果是?6+6=66 ?
3.4练习1:算术运算符:自加、自减
public class SignTest{
public static void main(String[] args){
int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.print("i="+i);
System.out.println("i1="+i1);
i = ++i1;
System.out.print("i="+i);
System.out.println("i1="+i1);
i = i2--;
System.out.print("i="+i);
System.out.println("i2="+i2);
i = --i2;
System.out.print("i="+i);
System.out.println("i2="+i2);
}
}
//输出:
i= i1=
i= i1=
i= i2=
i= i2=
3.5练习2
随意给出一个整数,打印显示它的个位数,十位数,百位数的值。
格式如下:
数字xxx的情况如下:
个位数:
十位数:
百位数:
例如:数字153的情况如下:
个位数:3
十位数:5
百位数:1
int num = 361;
int ge = num % 10;
int shi = (num / 10) % 10;
int bai = (num / 100) % 10;
System.out.println("数字" + num + "的情况如下:");
System.out.println("个位数:" + ge);
System.out.println("十位数:" + shi);
System.out.println("百位数:" + bai);
4.比较运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 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。
5.逻辑运算符
& —逻辑与
| —逻辑或
! —逻辑非
&& —短路与
|| —短路或
^ —逻辑异或
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 |
说明:该表是这样看的,以第二行举例,当a,b为true时,a&b、a&&b、a|b、a||b...这些运算符运算的结果
5.1 “&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算
5.2 “|”和“||”的区别:
“|”和“||”的区别同理, ||表示:当左边为真,右边不参与运算。
5.3 异或(^)的理解:
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。理解:异或,追求的是“异”
5.4 练习:请写出每题的输出结果
5.4.1
int x = 1;
int y=1;
if(x++==2 & ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);
5.4.2
int x = 1,y = 1;
if(x++==2 && ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);
5.4.3
int x = 1,y = 1;
if(x++==1 | ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);
5.4.4
int x = 1,y = 1;
if(x++==1 || ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);
5.5 面试题
class Test {
public static void main (String [] args) {
boolean x=true;
boolean y=false;
short z=42;
//if(y == true)
if((z++==42)&&(y=true))z++;
if((x=false) || (++z==45)) z++;
System. out.println(“z=”+z);
}
}
//结果为:z=46
6.位运算符
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3 << 2 = 12 --> 322=12 |
>> | 右移 | 3 >> 1 = 1 --> 3/2=1 |
>>> | 无符号右移 | 3 >>> 1 = 1 --> 3/2=1 |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 |3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 取反运算 | ~6 = -7 |
注意:没有"<<<"运算符
6.1位运算是直接对整数的二进制进行的运算
位运算符的细节
<< | 空位补0,被移除的高位丢弃,空缺位补0。 |
---|---|
>> | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
| | 二进制位进行|运算,只有0|0时结果时0,否则是1; |
^ | 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0;不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 |
~ | 正数取反,各二进制码按补码各位取反;负数取反。各二进制码按补码各位取反 |
7.三元运算符
7.1三元运算符与if-else的联系与区别:
1)三元运算符可简化if-else语句
2)三元运算符要求必须返回一个结果。
3)if后的代码块可有多个语句
7.2练习:获取两个数中的较大数
int a = 5,b=6;
int max = (a>b)?a:b;
System.out.println(max);
获取三个数中的较大数
int a = 5,b=6,c=10;
int max = (((a>b)?a:b)>c)?((a>b)?a:b):c;
System.out.println(max);