概述
目录
一.算术运算符
二.算术运算符的深入
三.赋值运算符
四.关系运算符
五.Scannner类
六.字符串拼接符
七.逻辑运算符
八.表达式
九.三目运算符/三元运算符
十.位运算符
十一.运算符的优先级别
一.算术运算符
算数运算符符号:+,-,*,/,%,--,++
public class Test01{
public static void main(String[] args){
int num1 = 20;
int num2 = 10;
System.out.println(num1+num2);//30
System.out.println(num1*num2);//200
System.out.println(num1/num2);//0
System.out.println(10%3);//1
//a++先使用在加
int a=10;
System.out.println(a++);//10
System.out.println(a);//11
//++b先加在使用
int b=10;
System.out.println(++b);//11
System.out.println(b);//11
//c--先使用在减
int c=10;
System.out.println(c--);//10
System.out.println(c);//9
//--d先减在使用
int d=10;
System.out.println(--d);//9
System.out.println(d);//9
}
}
二.算术运算符的深入
案例一:byte类型做运算会向上转型成int类型再做运算
byte b1=10;
byte b2=20;
byte result=(byte)(b1+b2);
System.out.println(result);
案例二:short类型做运算会向上转型成int类型再做运算
short s1=10;
short s2=20;
short result=(short)(s1+s2);
案例三:除byte和short做运算会向上转型成int类型,其他数据做运算都是转向取值范围大的类型
byte b=10;
short s=10;
int i=10;
long i=10;
float=10;
double=10;
System.out.println(b+b);//int
System.out.println(b+s);//int
System.out.println(b+i);//int
System.out.println(s+s);//int
System.out.println(s+i);//int
System.out.println(i+l);//long
System.out.println(l+f);//float
System.out.println(l+d);//double
System.out.println(f+d);//double
案例四:char类型做运算可以转化成int类型(获取其ASCII码),并且做运算
char i='a';
int x=i+1;
System.out.println(x);//98
案例五:浮点类型做运算有失去精度的风险
double d1 = 0.5;
double d2 = 0.4;
System.out.println(d1 - d2);//0.09999999999
案例六:a++;和++a没有区别,因为;表示执行语句的结束,不管先加还是后加都要加
int a = 0;
a++;
System.out.println(a);//1
int b =0;
++b;
System.out.println(b);//1
经典面试题1:输出结果为?
int a = 8;
int b=(a++)+(++a)+a*a;
System.out.println(b);//118
经典面试题2:输出结果为?
int i = 0 ;
i=++i;
System.out.println(i);//1
//基层原理:
//i=(int)i+1;
//i=i;
经典面试题3:输出结果为?
int i = 0 ;
i=i++;
System.out.println(i);//0
//基层原理:
//int temp =i;//底层有个变量temp记录了i的初始值
//i=(int)i+1;
//i=temp
三.赋值运算符
赋值运算符符号:=,+=,-=,*=,/=,%=,
public class Test01{
public static void main(String[] args){
int num = 10;
num += 5; //num = (int)(num+5);
num -= 5; //num = (int)(num-5);
num *= 5; //num = (int)(num*5);
num /= 5; //num = (int)(num/5);
num %= 3; //num = (int)(num%3);
System.out.println(num);//1
}
}
经典面试题一:输出结果为?
int a,b; //一次性声明多个变量
a = b = 100;//将100赋值给b,再把b赋值给a
System.out.println(a);//100
System.out.println(b);//100
经典面试题二:下面的两种写法结果分别是?
short s = 1;
s = s+1; //会报错,s是short类型,1是int类型,计算结果的类型是int,必须强转
short s=1;
s += 1;//底层实现:s = (short)(s+1);
赋值规则 s + = 1 s = (T) ((s) + (1))
复合赋值 E1 op= E2等价于简单赋值 E1 = (T)((E1) op (E2)), 其中T是E1的类型。
四.关系运算符
关系运算符符号:==、!=、>、>=、<、<=
public class Test01{
public static void main(String[] args){
int num1 = 20;
int num2 = 10;
boolean bool = num1 == num2;
System.out.println(bool);//false
System.out.println(num1 != num2);//true
System.out.println(num1 > num2);//true
System.out.println(num1 >= num2);//true
System.out.println(num1 < num2);//false
System.out.println(num1 <= num2);//false
}
}
经典面试题一:输出结果为?
int x = 10;
int y = 10;
boolean flag = (x == y);
System.out.println(flag);//true
flag = (x = y);//会报错,因为boolean类型不能与其他类型兼容
System.out.println(flag);
经典面试题二:输出结果为?
boolean b1 = true;
boolean b2 = false;
boolean b3 = (b1 == b2);
System.out.println(b3);//false
boolean b4 = (b1 = b2);
总结:1.=是赋值号,==是判断两个值是否相同
2.关系运算符的结果一定是boolean
五.Scannner类
知识点:Scanner类
含义:Java给我们提供的专门在控制台(cmd)输入数据的类
import java.util.Scanner;
public class Test05{
public static void main(String[] args){
//创建Scanner类的对象
Scanner scan = new Scanner(System.in);
System.out.println("请输入int类型的数据:");
int i = scan.nextInt();
System.out.println("请输入double类型的数据:");
double d = scan.nextDouble();
System.out.println("请输入String-字符串类型的数据:");
String str = scan.next();
System.out.println(i);
System.out.println(d);
System.out.println(str);
}
}
六.字符串拼接符
字符串拼接符符号:+
public class Test06{
public static void main(String[] args){
System.out.println(1 + 2 + "abc" + "def" + 1 +2); //"3abcdef12"
}
}
总结:+两侧都是数值,该符号为算数运算符
+有一侧是字符串或两侧都是字符串,该符号为字符串拼接符
七.逻辑运算符
逻辑运算符符号: &与 ,&&短路与 , |或 , ||短路或 ,^异或 ,!非
&与:前后两侧都是接boolean值,两者都成立(true),结果才为true
System.out.println(true & true);//true
System.out.println(true & false);//false
System.out.println(false & true);//false
System.out.println(false & false);//false
&& 短路与:前后两侧都是接boolean值,两者都成立(true),结果才为true
System.out.println(true && true);//true
System.out.println(true && false);//false
System.out.println(false && true);//false
System.out.println(false && false);//false
& vs &&
& :前者为false后,还会判断后者
&&:前者为false后,不会判断后者,效率更高
//ArithmeticException -- 算数异常
System.out.println(false & 10/0>5);//ArithmeticException
System.out.println(false && 10/0>5);//false
|或:前后两侧都是接boolean值,有一侧成立(true),结果就为true
System.out.println(true | true);//true
System.out.println(false | true);//true
System.out.println(true | false);//true
System.out.println(false | false);//false
||短路或:前后两侧都是接boolean值,有一侧成立(true),结果就为true
System.out.println(true || true);//true
System.out.println(false || true);//true
System.out.println(true || false);//true
System.out.println(false || false);//false
| vs ||
| :前者为true后,还会判断后者
||:前者为true后,不会判断后者,效率更高
System.out.println(true | 10/0>5);//ArithmeticException
System.out.println(true || 10/0>5);//true
^异或:前后两侧都是接boolean值,相同为false,不同为true
System.out.println(true ^ true);//false
System.out.println(false ^ true);//true
System.out.println(true ^ false);//true
System.out.println(false ^ false);//false
!非:置反,true变成false,false变成true
boolean bool1 = true;
System.out.println(!bool1);//false
boolean bool2 = false;
System.out.println(!bool2);//true
注意: 1.逻辑运算符运行结果都是boolean类型
2.&、&&、|、||、^ 两侧都是boolean类型数据
八.表达式
含义:描述某个语句
5 + 6 算数表达式
5 > 6 关系表达式
九.三目运算符/三元运算符
语法结构: 数据类型 变量 = (表达式)?值1:值2;
理解: 表达式的结果必须是boolean
true - 将值1赋值给变量
false- 将值2赋值给变量
做实验:
int num = (false)?10:20;
System.out.println(num);
需求1:输入两个int值,获取最大值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
int max = (a>b)?a:b;
System.out.println("最大值为:" + max);
需求2:输入两个int值,获取最小值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
int min = (a<b)?a:b;
System.out.println("最小值为:" + min);
需求3:输入三个int值,获取最大值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();
int max = (a>b)?a:b;
max = (max>c)?max:c;
System.out.println("最大值为:" + max);
需求4:输入三个int值,由小到大输出
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();
//最大值
int max = (a>b)?a:b;
max = (max>c)?max:c;
//最小值
int min = (a<b)?a:b;
min = (min<c)?min:c;
//中间值
int mid = a + b + c - max - min;
System.out.println(min + "<" + mid + "<" + max);
扩展面试题1:值1和值2都是常量的情况,按照取值范围大的类型返回
int a = 5;
System.out.println((a<5)?10.9:9);//9.0
扩展面试题2:值1和值2都是变量的情况,按照取值范围大的类型返回
char x = 'x';//ASCII - 120
int i = 10;
System.out.println(false?i:x);//120
扩展面试题3:
char x = 'x';//ASCII - 120
System.out.println(false?100:x);//x
System.out.println(false?65536:x);//120
三目运算符的返回值规则:
1.值1和值2都是常量的情况,按照取值范围大的类型返回
2.值1和值2都是变量的情况,按照取值范围大的类型返回
3.值1和值2一个是常量一个是变量的情况,常量是否在变量所属类型的取值范围里:
在:就按变量类型返回数据 ,不在:就按常量类型返回数据
十.位运算符
含义:将十进制的数据转换为二进制再做运算
位运算符符号: & 与、| 或、^ 异或, <<左移, >>右移, >>>无符号位右移
int i1 = 27;//0000,0000,0000,0000,0000,0000,0001,1011
int i2 = 21;//0000,0000,0000,0000,0000,0000,0001,0101
//&:同位比较,两者为1,结果才为1
System.out.println(i1 & i2);//17 - 0000,0000,0000,0000,0000,0000,0001,0001
//|:同位比较,两者有1,结果就为1
System.out.println(i1 | i2);//31 - 0000,0000,0000,0000,0000,0000,0001,1111
//^:同位比较,两者相同为0,不同为1
System.out.println(i1 ^ i2);//14 - 0000,0000,0000,0000,0000,0000,0000,1110
&、|、^ 符号两侧都是数值,该符号为位运算符
&、|、^ 符号两侧都是boolean值,该符号为逻辑运算符
<<左移:整体向左移动n位,就用n个0补位
int i1 = 1024;//0000,0000,0000,0000,0000,0100,0000,0000
System.out.println(i1 << 2);//4096- 0000,0000,0000,0000,0001,0000,0000,0000
>>右移:整体向右移动n位,就用n个符号位补位
int i2 = 100;//0000,0000,0000,0000,0000,0000,0110,0100
System.out.println(i2 >> 2);//25 - 0000,0000,0000,0000,0000,0000,0001,1001
int i3 = -100;//1111,1111,1111,1111,1111,1111,1001,1100
System.out.println(i3 >> 2);//-25 - 1111,1111,1111,1111,1111,1111,1110,0111
>>>无符号位右移:整体向右移动n位,就用n个0补位
注意:无符号位右移正数和右移没有区别
System.out.println(i2 >>> 2);//25 - 0000,0000,0000,0000,00000000,0001,1001
System.out.println(i3 >>> 2);//10亿多 - 0011,1111,1111,1111,1111,1111,1110,0111
面试题1:用最有效率的方式计算出2*8
System.out.println(2<<3);
面试题2:说出以下代码的输出结果
考点:char类型的取值范围没有负数,向上转型使用0补位
//-1 int:1111,1111,1111,1111,1111,1111,1111,1111
//(byte):1111,1111
//(char):1111,1111,1111,1111
//(int) :0000,0000,0000,0000,1111,1111,1111,1111
System.out.println((int)(char)(byte)-1);//65535
十一.运算符的优先级别
经验:不用记,灵活运用小括号即可
最后
以上就是有魅力毛衣为你收集整理的史上最全运算符讲解的全部内容,希望文章能够帮你解决史上最全运算符讲解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复