运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
一.运算符
1. 三目运算符/三元运算符
语法结构:
数据类型 变量名 = (表达式)?值1:值2;
理解:
表达式的结果必须是boolean的值
true - 将值1赋值给变量
false- 将值2赋值给变量
例:
int num = (true)?10:20;
System.out.println(num);
结果为:10
int num = (false)?10:20;
System.out.println(num);
结果为:20
案例1:输入两个int值,返回最大值
Scanner scan = new Scanner(System.in);
System.out.println("输入两个int值,返回最大值");
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值,返回最大值");
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);
运行结果:
案例3:输入三个int值,从小到大输出
Scanner scan = new Scanner(System.in);
System.out.println("输入三个int值,从小到大输出");
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("从小到大输出:");
System.out.println(min);
System.out.println(mid);
System.out.println(max);
运行结果:
三目运算符的深入
扩展面试题1:
int a=5;
System.out.println("a="+((a<5)?10.9:9));
A. 编译错误
B. 10.9
C. 9
D. 以上答案都不对
结果是:答案是D,a=9.0
扩展面试题2:
char x='x';
int i=10;
System.out.println(false?i:x);
System.out.println(false?100:x);
A. 120 x
B. 120 120
C. x 120
D. 以上答案都不对
结果是答案是A,120 x
扩展面试题3:
char c = 'x';//ASCII - 120
System.out.println(false?100:c);//结果为:x
System.out.println(false?65536:c);//结果为:120
返回值规则:
1.值1和值2都是数字字面量(常量)的情况,会按照取值范围大的类型转型
2.值1和值2都是变量的情况,会按照取值范围大的类型转型
3.值1和值2一个是常量一个是变量的情况:
常量如果在变量所属的取值范围内:使用变量类型表示
常量如果不在变量所属的取值范围内:使用常量类型表示
2. 字符串拼接符
运行代码:
System.out.println(1 + 2 + "abc" + "def" + 1 + 2);
运行结果:3abcdef12
规则: 从左往右
+ 如果两侧是数值,该符号为算数运算符
+ 如果有一侧是字符串,该符号为字符串拼接符
3. 位运算符: & 、 |、 ^ 、 <<(左移)、 >>(右移)、 >>>(无符号右移)
& 与:同位比较,两者为1,结果则为1
| 或:同位比较,两者有1,结果就为1
^ 异或:同位比较,两者不同为1,相同为0
<< 左移:整体向左移动n位,用n个0补位
例:
byte b1 = 10;
System.out.println(b1 << 3);//运行结果:80
分析:
二进制表达:
//byte 10:0000,1010
//int 10:0000,0000,0000,0000,0000,0000,0000,1010
//<< 3 :0000,0000,0000,0000,0000,0000,0101,0000 读为:80
>> 右移:整体向右移动n位,就用n个最高位补位(正数最高位为0,负数最高位为1)
例:
byte b1 = 10;
System.out.println(b1 >> 3);//运行结果为:1
正数分析:
二进制表达:
//byte 10:0000,1010
//int 10:0000,0000,0000,0000,0000,0000,0000,1010
//>> 3 :0000,0000,0000,0000,0000,0000,0000,0001 读为:1
例:
byte b2 = -10;
System.out.println(b2 >> 3);//运行结果为:-2
负数分析:
二进制表达:
//byte -10:1111,0110
//int -10:1111,1111,1111,1111,1111,1111,1111,0110
//>> 3 :1111,1111,1111,1111,1111,1111,1111,1110
>>> 无符号位右移:整体向右移动n位,就用n个0补位
例:
byte b2 = -10;
System.out.println(b2 >>> 3);//536870910
负数分析:
二进制表达:
//byte -10:1111,0110
//int -10:1111,1111,1111,1111,1111,1111,1111,0110
//>>> 3 :0001,1111,1111,1111,1111,1111,1111,1110
经典面试题:
//面试题1:用最有效率的方式计算2*8
//2 - 0000,0010
//<<3 - 0001,0000
System.out.println(2<<3);
//面试题2:描述一下代码的运行结果
// 考点:char类型的取值范围为0~65535,所以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
4. 表达式
5+6:算数表达式
5>6:关系表达式
5|6:位运算表达式
5. 运算符的优先级别
总结
&、|、^ 符号两侧都是数值,此符号为位运算符
&、|、^ 符号两侧都是boolean值,此符号为逻辑运算符
>> 和 >>> 在移动正数时没有区别