「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」。
赋值运算符
赋值运算符:=(可以连续赋值)、+=、-=、*=、/=、%=
public class SetValue {
public static void main(String[] args){
int x,y;
x=y=10;//连续赋值
int a=10,b=20;
int a1=b=10;//编译通过,将10赋给b,再将表达式的值赋给a,连等的话第二个必须是之前定义过的。下一行是反例
//int a2=z=20;
a1+=10;//a1=a1+10;
int num=12;
num%=5;
System.out.println(a1);
System.out.println(num);
short num1=10;
//num1=num1+2;//数据类型编译不通过
num1+=2;//可以通过,不改变变量本身数据类型,2不是int型
System.out.println(num1);
System.out.println("*****************开发中实现加2操作方式**********************");
int num3=0;//注意:变量使用前必须赋初值(尤其是局部变量)
num3+=2;//方式一
num3=num3+2;//方式二
num3++;num3++;//方式三,两次++
System.out.println("*****************练习一**********************");
int i=1;
i*=0.1;//编译能过,不改变变量本身数据类型,0.1化成整型0
System.out.println(i);//0
i++;
System.out.println(i);//1
System.out.println("*****************练习二**********************");
int n=10,m=10;
n*=(m++);//编译能过,类似于C中的运算符混合,注意优先级和是什么表达式
System.out.println(m);//11
System.out.println(n);//100
n=10;
n+=(n++)+(++n);//和C不同,+=中n=n+(n++)+(++n)中第一个n直接赋值为10,而不是两次++后的12,下同
//注意与C中的区别 ???(略有点不理解)()上一行
System.out.println(n);//32
int o=2;
o+=(o++);
System.out.println(o);
}
}
比较(关系)运算符
| 运算符 | 解释 |
|---|---|
| == | 等于 |
| != | 不等于 |
| < | 小于 |
| 大于 | |
| <= | 小于等于 |
| >= | 大于等于 |
| instanceof | 检查是否是类的对象 |
比较运算符的结果都是boolean型,结果不是true就是flase
(>、<、>=、<=)只能使用在数值类型的数据之间
= =、!=不仅可以使用在数值类型的数据之间,还可以使用在引用变量类型之间
注意:==和=
public class Compare {
public static void main(String[] args){
int i=10,j=20,0=20;
System.out.println(i==j);//输出语句中放一个关系(比较)表达式,因为是boolean类型,结果为false
System.out.println(i=j);//输出语句中也可以放表达式,赋值表达式,结果式20
boolean x=true,y=false;//布尔型也可以用来比较
System.out.println(x==y);//false
System.out.println(x=y);//true
if(o>10.0);//可以通过编译,虽然o是int,10.0是double但是可以比较,因为比较时o会变类型
if(y==true);//可以用来进行判断,不等于执行else
else;
}
}
逻辑运算符
&逻辑与(全真才为真)
&&短路与(全真才为真)
|逻辑或(全假才为假)
||短路或(全假才为假)
!逻辑非(真假颠倒)
^逻辑异或(同为假,不同为真)
逻辑运算符操作的都是boolean类型的变量
public class Logic {
public static void main(String[] args){
boolean x=false;
int num1=10;
if(x&(num1++)>0){//比较运算符结果是boolean,所以可以用吧逻辑与和短路与
System.out.println("*********");
}else{
System.out.println("----------");
}
System.out.println(num1);//11
boolean y=false;
int num=10;
if(x&&(num++)>0){
System.out.println("*********");
}else{
System.out.println("----------");
}
System.out.println(num);//10,就是说num++没有执行
//总结:&和&&运算结果同,&&和C中的逻辑运算符一样,具备短路原则,而&没有短路一说,全部执行完
//短路或和短路与效率更高
int o=1;
if(o++==1);//结果是true,o=2,注意前++和后++
boolean a=true;
boolean b=false;
short c=42;
if((c++==42)&&(b=true))c++;
if((a=false)||(++c==45)) c++;//结果是46,注意==还是=
System.out.println(c);//中文括号也不行,过不去编译
}
}
位运算符
| 运算符 | 运算 | |
|---|---|---|
| << | 左移 | 向左移n位相当于在原来的基础上乘了一个(一定范围内,n太变为负数,首位移成了1) 负数一定范围内也适用(符号位保持不变,一直是1) 左移指在二进制时整体向左移动,后面出现空缺用0补齐 |
| >> | 右移 | 向右移n位相当于在原来的基础上除了一个 右移后左边空数(正数全补0,负数全补1) |
| >>> | 无符号右移 | 不管原来是正数还是负数都拿0补 |
| & | 与运算 | 二进制位进行&运算,只有1&1时结果是1,否则是0;(全1才为1) |
| | | 或运算 | 二进制位进行|运算,只有0|0时结果是0,否则是1;(全0才为0) |
| 异或运算 | 同为0,不同为1 | |
| ~ | 取反运算 | 正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 |
&、|、^是逻辑还是位取决于左右的类型,如果是布尔型就是逻辑,不是则是位
位运算是直接对整数的二进制进行的运算,位运算符操作的都是整型的数据
public class Bit {
public static void main(String[] args){
int i=21;
System.out.println(i<<2);//84
System.out.println("i<<2="+(i<<2));//84
System.out.println("i<<2="+(4<<2));//16
System.out.println("i<<2="+(-2<<2));//-8
//最高效计算2*8——2<<3、8<<1
System.out.println(4&5);//4
System.out.println(4|5);//5
System.out.println(4^5);//1
System.out.println(~5);//-6
}
}
三元运算符
(条件表达式)?表达式:表达式2;
条件表达式的结果必须是boolean类型的,结果为true执行表达式1,false执行表达式2
表达式1和2要求是一致的(不一定类型相同)
public class Condition {
public static void main(String[] args){//三元运算符的结果需要同样的数据类型的变量接收
//获取两个整数较大值
int m=10,n=12,x;
int max=(m>n)?m:n;//m和n的值必须符合前面的数据类型,且m和n不一定是一个统一的类型
//x=m>n?2:1.0;//x不行,必须是能将两个数据类型统一起来的
double y=m>n?2:1.0;//double就可以
//m>n?System.out.println("***"):System.out.println("---");//编译不通过,必须是表达式
String con=m>n?"m大":"n大";//如果m=n就不合适,所以进行嵌套
String maxStr=m>n?"m大":(m==n?"相等":"n大");//注意m等于n不是m=n,而是m==n,前一个是赋值
System.out.println("*************获取三个数最大值********");
//方法一
int a=10,b=20,c=30;
int max0=a>b?a:b;
int max1=max0>c?max0:c;
System.out.println(max1);
//方法二
int maxOne=a>b?(a>c?a:c):(b>c?b:c);
int maxtwo=(a>b?a:b)>c?(a>b?a:b):c;//两种方法都可以,但第二种不建议
System.out.println(maxOne);
System.out.println(maxtwo);
//凡是可以用三元(目)运算符,都可以改写成if-else,反之,不成立
//三元效率比if-else高
//如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。
}
}
运算符的优先级
结合性
只有单目运算符、三元运算符、赋值运算符是从右向左运算的(右结合性)。