一、/* 面试题:下面的语句有没有问题,如果有,请解释。 byte b1 = 3; byte b2 = 4; byte b3 = b1 + b2; byte b4 = 3 + 4; 有问题,在byte b3 = b1 + b2;报错。 解释: b1 + b2在参与运算的时候,首先会自动转换成int类型。 在这个时候,b1和b2其实都被提升了类型。所以,他们的计算结果也应该是int类型。 最终,就相当于直接把int类型赋值给byte类型,所以,会有精度的损失。 如果参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。如果是,就不报错。 */ classVariableDemo4 { public static void main(String[] args) { byte b1 = 3; byte b2 = 4; byte b3 = (byte)(b1 + b2); byte b4 = 3 + 4; System.out.println(b3); System.out.println(b4); } } 二、 public class Test { public staticvoid main(String[] args) { int i = 1; i = i++;//1 i=++i;//2 System.out.println(i); } } ①把变量i的值取出来,放在一个临时变量里(我们先记作temp); ②把变量i的值进行自加操作; ③把临时变量temp的值作为自增运算前i的值使用, 在本题中就是给变量i赋值。因此,经过以上三步操作以后, 虽然变量i在第②步操作中进行了自增运算, 但第三步操作以后又把原来的值赋给了它,故最后输出结果为1 三、 short s = 5; //s = s + 2; //报错 s += 2; System.out.println(s); 注意: 虽然a+=20和a=a+20效果等价,但是还是有些区别。 +=这种赋值运算符,其实隐含了强制类型转换功能。 也就是说: short s = 5; s+=2; 等价于 s = (short)(s+2); 四、 /* 面试题: 请自己实现两个整数变量的交换 注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。 */ class OperatorTest{ public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a:"+a+",b:"+b); //方式1:使用第三方变量(开发中用的) /* int c = a; a = b; b = c; System.out.println("a:"+a+",b:"+b); System.out.println("------------"); */ //方式2:用位异或实现(面试用) //左边:a,b,a //右边:a ^ b /* a = a ^ b; b = a ^ b; //a ^ b ^ b = a a = a ^ b; //a ^ b ^ a = b System.out.println("a:"+a+",b:"+b); */ //方式3:用变量相加的做法 /* a = a + b; //a=30 b = a - b; //b=10 a = a - b; //a=20 System.out.println("a:"+a+",b:"+b); */ //方式4:一句话搞定 b = (a+b) - (a=b);//b=30-20=10,a=20 System.out.println("a:"+a+",b:"+b); } }
|