目录
一、运算符
1.算术运算符
1.1 面试题一:
下列输出结果为?
int a = 8;
int b =(a++)+(++a)+(a*10);
//代码一 证明:
public class 类名(备注:类名请自己取){
public static void main (String[] args){
int a = 8;
int b =(a++)+(++a)+(a*10);
System.out.prinln(b);//118
}
}
1.2 面试题二:
下列输出结果为:
int i = 0;
i = ++i;
System.out.println(i);
int i = 0;
i = i++;
System.out.println(i);
//代码二 证明:
public class 类名(备注:类名请自己取){
public static void main (String[] args){
int i = 0;
i = ++i;
System.out.println(i);//i=1
int i = 0;
i = i++;
System.out.println(i);// i=0
}
}
代码一 理解
分析解剖:int b=(a++)+(++a)+(a * 10);
可拆分为:c=(a++);d=(++a);e=(a * 10);
所以:int b=c+d+e;
从左到右依次计算;
a++为先使用再自增,使用a=8先复制给c=8后,a再自增为9,a再更新变量为:9
++a先自增,再使用,当a=9时,++a先自增为10后,更新变量为10;再赋值给d;此时d=10;
跟新的变量a=10,所以e=((a=10)*10)=100;所以e=100;
故,int b=c+d+e=8+10+100=118;所以:int b=(a++)+(++a)+(a*10)=118;
代码二 理解
i = ++i; //++i为先自增,在使用
//底层原理:
//i = (int)(i+1);
//i = i;
System.out.println(i);//1 i = i++;//i++为先使用,再自增
//底层原理:
//int temp = i;–temp用于记录i最初的值
//i = (int)(i+1);
//i = temp
System.out.println(i);//0
2.赋值运算符
2.1 面试题一:
int a,b;
a = b = 100;
System.out.println(a);
System.out.println(b);
2.2 面试题二:
//下面的两种写法结果分别是?
short s=1;
s = s+1;
short s=1;
s += 1;
代码一 理解
public static void main(String[] args){
//输出结果为?
//一次性声明多个变量
int a,b;
a = b = 100;//把100赋值给b,b再赋值给a
System.out.println(a);//100
System.out.println(b);//100
}
代码二 理解
public static void main(String[] args){
//下面的两种写法结果分别是?
short s=1;
s = s+1;//报错:short类型的变量s 与 int类型的数字字面量1 做运算的结果是int类型
short s=1;
s += 1;//s = (short)(s+1);//s=2;
}
3.关系运算符
3.1 面试题一:
指出下列输出结果:
int x = 10;
int y = 10;
boolean flag = (x == y);
System.out.println(flag);
flag = (x = y); System.out.println(flag);
3.2 面试题二:
指出下列输出结果:
boolean b1 = true;
boolean b2 = false;
boolean b3 = (b1 == b2);
System.out.println(b3);
boolean b4 = (b1 = b2);
System.out.println(b4);
代码一 理解
public static void main(String[] args){
int x = 10;
int y = 10;
boolean flag = (x == y);
System.out.println(flag);//true
flag = (x = y);//报错:boolean不能与其他类型兼容
System.out.println(flag);
}
代码二 理解
public static void main(String[] args){
boolean b1 = true;
boolean b2 = false;
boolean b3 = (b1 == b2);//因为true!=false,所以b3为false
System.out.println(b3);//false
boolean b4 = (b1 = b2);//将b2赋值给b1,再将赋值过后的b1赋值给b4
System.out.println(b4);//false
}
4.三目运算符/三元运算符
4.1 面试题一:
int a = 5;
System.out.println(“a=”+((a<5)?10.9:9));
A. 编译错误 B. 10.9
C. 9 D: 以上答案都不对
4.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. 以上答案都不对
4.3 面试题三:
char m = ‘x’;
System.out.println(false?100:m);
System.out.println(false?65536:m);
解析面试题一
int a = 5;
System.out.println(“a=”+((a<5)?10.9:9));
//(a<5)==(5<5)所以条件不成立为false
10.9:9 //其中10.9为double类型 9为int类型,故9由int类型自转为double类型
从而实际上是10.9:9.0
三目运算符,true选前者,false选后者,
故输出结果为a=9.0
所以选D答案
解析面试题二
char x =‘x’;
int i =10;
System.out.println(false?i:x);//120
System.out.println(false?100:x);//x
(i:x)==(10:120) //注意:120为是 x的ASCII码的值
前者为int类型,后者为char类型自上而下的自动转换成int类型才能来做比较
故第一个输出为:120
false?100:x 值一为常量,值二为变量
且常量在变量类型的取值范围内
则按照值二变量类型返回数据
故第二个输出为:x
故选择A答案
解析面试题三
char x = ‘x’;//‘x’ - ASCII - 120
System.out.println(false?100:x);//x
System.out.println(false?65536:x);//120
(false?)100:x 同理与面试题二 输出为x
false?65536:x 值一为常量,值二为变量
且常量不在变量类型的取值范围内,char的取值范围为(0~65535)
则按照值二变量类型自上而下自动转成int类型,'x’的ASCII码为120
即第二个输出值为120
所以输出的结果为 x 和 120
5.位运算符
5.1 面试题一:
使用最有效率的方式计算2*8
5.2 面试题二:
描述下列代码的输出结果
System.out.prinlnt((int)(char)(byte)-1);
解析 面试题一:
使用最有效率的方式计算2*8
最有效率的方式为二进制编码;而非使用计算
直接使用整体左移3个位;然后系统自动补位
故使用:System.out.println(2<<3);
解析 面试题二
描述下列代码的输出结果
System.out.prinlnt((int)(char)(byte)-1);65535
//-1 int:1111,1111,1111,1111,1111,1111,1111,1111
//(byte):1111,1111//(char):1111,1111,1111,1111 – char类型向上转型用0补位
//(int) :0000,0000,0000,0000,1111,1111,1111,1111
//所以输出为65535