问题一:以下哪句会编译失败,并说明原因。
byte b1=3, b2=4, b;
b=b1+b2;
b=3+4;
分析:
b=b1+b2将会编译失败。因为b1和b2是变量,变量参与运算时,首先会考虑数据类型。因此,byte类型会进行默认类型提升,默认使用int类型进行存储。而b为byte类型,故存在数据不兼容,编译失败。
在b=3+4中 ,3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围,如果没有可以赋值。如果超出byte类型范围,则会编译失败,需进行强制转换后,可编译成功。
注意:byte,short,char三种数据类型在参与运算时,会默认提升为int类型。
问题二:请写出下列程序的运行结果。
- System.out.println(‘a’);
- System.out.println(‘a’+1);
- System.out.println(“hello”+’a’+1);
- System.out.println(‘a’+1+”hello”);
- System.out.println(“5+5=”+5+5);
- System.out.println(5+5+“=5+5”);
分析:对于1,为字符类型,直接输出字符a。对于2,“+”为运算符,a的ASCII代码为97,故结果为98。对于3,首先为字符串参与运算,故两个“+”都为拼接符,输出结果为helloa1。对于4,字符串在最右侧,第一个“+”为运算符,第二个“+”为拼接符,故输出结果为98hello。对于5,“5+5=”为字符串类型,故“+”全部为拼接符,因此输出结果为5+5=55。对于6,第一个“+”为运算符,由于最右侧为字符串类型,故第二个“+”为拼接符,结果为10=5+5。
问题三:以下两个代码是否有问题,如果有,哪里有问题。
1) short s=1; s=s+1;
2) short s=1; s+=1;
分析:对于1),short类型变量参与运算时,会进行默认类型提升,默认使用int类型进行存储。而左侧接受侧为short类型,故存在数据不兼容,编译失败。
对于2),由于扩展运算符+=具有默认的强制类型转换,s+=1等价于s=(short)(s+1),故不会存在编译错误。
问题四:求出以下a,b,c的值。
int a=10;
int b=10;
int c=10;
a= b++;
c= --a;
b=++a;
a=c–;
分析:第四行:a=10, b=11, c=10;第五行:a=9, b=11, c=9; 第六行:a=10, b=10, c=9; 第七行:a=9, b=10, c=8.
注意:a++,先进行赋值运算,后进行自加;++a先进行自加,然后进行赋值运算。
问题五:求x和y的值。
int x=4;
int y=(x++)+(++x)+(x*10);
分析:x=4。y=4+6+6*10=70。x++首先进行运算,然后进行自增,因此在(x++)中,首先将x=4的值赋给(),然后进行自增。