java运算符:数学运算符,位运算符,逻辑运算符,自增运算符,比较运算符,三木运算符.移位运算符
运算符的封闭性:java的运算符存在封闭原则.同种类型的数据参与计算,获得同种类型的结果;如果不同类型的数据参与计算,获得大的类型的结果.
加(+) 减(-) 乘(*) 除(/) 取余(%)
1. 加号:如果表达式中存在字符串,可以实现拼接的功能.如果表达式是数字类型进行加法计算
int i=1;
double d=1.2;
//java运算符的封闭性,int和double计算结果是double
double result=i+d;
System.out.println(result);
int i1=3;
int i2=4;
//java运算符的封闭性,int类型和int类型计算结果为int
int i3=i1/i2;
System.out.println("i3="+i3);//0
double i4=(double)i1/i2;
System.out.println("i4="+i4);//0.75
int max=0x7fff_ffff;
int a=max+1;
//进行运算考虑边界问题.防止数据的溢出
System.out.println("a="+a);//a=-2147483648
前缀自增:++a/–a,先将a的值加1作为表达式的值.
后缀自增:a++/a–,先将a的值作为表达式的值,然后a再加1.
+= *= /= %= -=
int a=1;
//后缀自增,先将a的值作为a++的值,执行完成之后再将a+1
int b=a++; //a=a+1
System.out.println("a="+a+" ,b="+b);//a=2,b=1;
int x=1;
//前缀自增,先将a的值+1,然后将a的值作为整个表达式的值
int y=++x;
System.out.println("x="+x+" ,y="+y);//x=2,y=2
int z=2;
z=z++;
//结果z=2:java中同行代码中对于变量的赋值只能发生一次
System.out.println("z="+z);
byte c=1;
//对于自增运算符jvm可以进行优化
byte d=++c; //d=c+1;
System.out.println("d="+d);//d=2;
d+=4;//d=d+4;
System.out.println("d="+d);
int i=3;
i+=4;//i=i+4;
System.out.println("i="+i);
int m=1;
int n=++m+m++;
System.out.println("n="+n+",m="+m);//n=4,m=3
特点:对java中的整数进行位位运算.本质将整数的二进制对应的位置进行计算
1 | 符合 | 说明 |
---|---|---|
按位与 | & | 同1为1,其他为0 |
按位或 | | | 同0为0,其他为1 |
异或 | ^ | 相同为0,不同为1 |
取反 | ~ | 一元元算符号,按位取反 |
int x=3;// 0000_0011
int y=7;// 0000_0111
int and=x&y; //0000_0011
System.out.println("and="+and);//3
int or=x|y;// 0000_0111;
System.out.println("or="+or);//7
int other=x^y;//0000_0100;
System.out.println("other="+other);//4
int back=~x;// 24个1_1111_1100
System.out.println("back="+back);//-4
//练习 声明两个整数,采用位运算符实现交换
int a=100;//0110_0100
int b=200;//1100_1000
System.out.println("交换前:a="+a+",b="+b);
// result=a^b //1010_1100
// result^a //1100_1000
// result^b //0110_0100
int result=a^b;
a=result^a;
b=result^b;
System.out.println("交换后:a="+a+",b="+b);
特点:java对于整型直接对其二进制进行移位操作.移位运算 >>= >>>= <<=
说明 | 符号 | 描述 |
---|---|---|
左移 | n<< | 将n向左边移动m位,最低位使用0补充 |
有符号右移 | n>>m | 将n向右边移动m位,最高位使用符号位补充 |
无符号右移 | n>>>m | 将n向右边移动m位,最高位使用0补充 |
int result=2<<3;
System.out.println("效率最高的将2扩大八倍的写法:"+result);
//进行左移,可能结果为负数
int a=2<<30;
System.out.println("a="+a);//-2147483648
//如果移动的位数大,实际取该数据的低五位.[移动位数对32取余]
int b=2<<35;//16 35%32=3
System.out.println("b="+b);
int i=-1;//-1的二进制 32个1
//有符号的右移,最高位使用符号位补充
int c=i>>1;
System.out.println("c="+c);//c=-1
int d=i>>>1;//无符号右移,最高位使用0补充
System.out.println("d="+d);// d=0x7fff_ffff
byte f=0b0110_0100;//100
//获得f的高四位0000_0110 和低四位0000_0100
//低四位
byte low=(byte)(f&0x0f);//(byte)(f&0B0000_1111);//4
System.out.println(low);
//高四位
//1.需要将高四位变为低四位 采用无符号右移运算
byte high=(byte)((f>>>4)&0xf);
System.out.println("high="+high);//6
特点:比较关系,比较运算符的结果为一个布尔类型.>= <= == !=,注意:java中等号是赋值的符号,双等号采用比较变量值的比较运算符.
boolean flag=1==2;//flag=false
//描述age的范围在 [22,40]
int age = 18;
// boolean noHappy=22<=age<=40;//编译报错,java中不支持连续判断
特点:表达式之间的逻辑关系
说明 | 语法 | 描述 |
---|---|---|
与 | exp1 && exp2 | 如果exp1和exp2都为true,结果为true,否则为false |
或 | exp1 || exp2 | 如果epx1和exp2都为false,结果为false,则为true |
非 | !exp1 | 取反,如同exp1为true,结果为false |
Scanner sc=new Scanner(System.in);
System.out.println("请输入年龄:");
int age=sc.nextInt();
//表示age是否在[22,40]
// boolean noHappy=(age>=22 && age<=40);
boolean noHappy=(age>=22 & age<=40);
System.out.println("青年人:"+noHappy);
//表示age的范围小于18,大于60
// boolean happy=(age<=18 || age>=60);
boolean happy=(age<=18 | age>=60);
System.out.println("豆蔻年华:"+happy);
int x=1;
int y=2;
boolean flag=(x++>0||--y<2);//具有短路功能
System.out.println("flag="+flag+" ,x="+x+" ,y="+y);//true,2,2
int a=1;
int b=2;
boolean flag2=(a++>0|--b<2);//不具备短路功能
System.out.println("flag2="+flag2+" ,a="+a+" ,b="+b);//true,2,1
int i=1;
int j=2;
int k=3;
//建议:如果需要连续判断,建议使用括号进行分组
boolean flag3=(i++>0 || j--<3 && --k<3);
//等价于 flag3= (i++>0) || (j--<3 && --k<3) ;
//true,2,2,3
System.out.println("flag3="+flag3+" ,i="+i+" ,j="+j+" ,k="+k);
特点:三目运算符就是if..else的简写.基本语法: 布尔表达式?为true的结果:为false的结果
Scanner sc=new Scanner(System.in);
System.out.println("请输总记录数:");
int total=sc.nextInt();
System.out.println("每页显示的记录数:");
int pageSize=sc.nextInt();
//计算总页数
/*
int size=0;
if(total%pageSize==0){//说明可以整除
size=total/pageSize;
}else{
size=total/pageSize+1;
}
*/
//三目(三元)运算
int size=total%pageSize==0?total/pageSize:total/pageSize+1;
System.out.println("总页数为:"+size);
三木运算符可以进行嵌套
//案例:从控制台输入3个整数,使用三木运算符获得其中的最大值(三木运算符的嵌套)
System.out.println("请输入三个整数");
int a=sc.nextInt();
int b=sc.nextInt();
int c=sc.nextInt();
//获得最大值
int max=a>b?(a>c?a:c):(b>c?b:c);//三木运算符可以进行嵌套
System.out.println("max="+max);