1、题目:下面那句代码是编译失败的?为什么?
1 byte b1=3,b2=4,b; 2 b=b1+b2; 3 b=3+4;
(1)分析:
①第一句定义变量b1、b2和b,其中b1赋值3,b2赋值4,没有问题;
②第二句b=b1+b2;中的b1+b2是int类型(Java中整数默认是int类型),应该改为b=(byte)b1+b2; ;
③第三句b=3+4;中的3+4是常量,具有常量优化机制,可以直接识别为byte,所以正确。
(2)答案:
①第二句话正确;
②b=b1+b2;中,b是byte类型,而b1+b2是int类型,范围由大转小需要进行强制转换,需要改成b=(byte)b1+b2; 。
2、题目:byte by=130; 这句代码有没有问题?有问题如何解决?结果是多少?
(1)分析:
①byte的取值范围是-128~127,130超出了这个范围,所以不会成功进行编译;
②byte by=130; 这句代码的左边为byte类型,右边为int类型,需要进行强制转换,改成byte by=(byte)130; ;
③由原码、反码、补码相关知识得知,b=-126 。
(2)答案:
①有问题;
②改为byte by=(byte)130; ;
③结果为:-126 。
3、题目:下面那句代码是编译失败的?为什么?
1 byte b = 10; 2 b++; 3 b = b + 1;
(1)分析:
①第一句byte b=10; 由于编译器进行了常量优化,没有问题;
②第二句b++; b进行了自增,b=11 ;
③第三句b = b + 1; 左边b是byte类型,右边b+1; 中b是byte类型,b+1是byte类型和int类型,结果是int类型,需要进行强制转换,应该改为b=(byte)(b+1); 。
(2)答案:
①第三句代码编译失败;
②b = b + 1; 左边b是byte类型,右边b+1; 中b是byte类型,b+1是byte类型和int类型,结果是int类型,需要进行强制转换;
③第三句代码应该改为b=(byte)(b+1); 。
4、题目:short s = 1; s = s + 1;有没有问题?如果有怎么解决?
(1)分析:
①第一句代码是定义short变量s,并赋值1,没有问题;
②第二句代码s = s + 1;左边是short类型,右边s+1; 是short类型和int类型相加结果是int类型,需要进行强制转换;
③应该改成s=(short)(s+1); 。
(2)答案:
①有问题;
②第二句话改成s=(short)(s+1); 。
5、题目:short s = 1; s += 1;有没有问题?如果有怎么解决?
(1)分析:
①第一句代码short s = 1; 定义了short变量s,并赋值1,没有问题;
②第二句代码s += 1; 由于赋值运算符+=进行了自动强制类型转换,所以没有问题。
(2)答案:没有问题。
6、题目:分析以下需求,并用代码实现
(1)已知一个三位数,请分别获取该三位数上每一位的数值;
(2)例如:123的个位、十位、百位,分别是3、2、1;
(3)打印格式"数字123的个位是 3, 十位是 2, 百位是 1" 。
(4)分析:
①123的百位数1:123/100;
②123的十位数2:123%100=23,23/10 ;
③123的个位数3:123%100=23,23%10=3
(5)代码实现:
1 public class NumDemo { 2 public static void main(String[] args) { 3 int num = 123; 4 // 百位数 5 int hd = num / 100; 6 // 十位数 7 int td = num % 100 / 10; 8 // 个位数 9 int od = num % 100 % 10; 10 System.out.println("数字123的个位是" + od + ",十位是" + td + ",百位是" + hd); 11 } 12 13 }
运行结果:
7、题目:看程序说结果,请不要提前运行。
1 public class Test1 { 2 public static void main(String[] args) { 3 int x = 4; 4 int y = (--x) + (x--) + (x * 10); 5 System.out.println("x = " + x + ",y = " + y); 6 } 7 }
(2)分析:
①第三句代码,定义了int变量x,并赋值4;
②第四句代码,--x为4-1=3,x--为3,x*10为2*10=20 ,所以y=3+3+20=26 ;
③第5句代码,输出x=2,y=26 。
(3)答案:
x=2,y=26