废话不多说,直接上题目
接下来就是见证奇迹的时刻:请先不要运行代码,猜一下输出的结果:
1.
public class Test1{
public static void main(String[] args){
System.out.println(2.0 - 1.1);
}
}
2.
public class Test2{
public static void main(String[] args){
System.out.println(12345 + 5432l);
}
}
3.
public class Test3{
public static void main(String[] args){
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
}
}
4.
public class Test4{
public static void main(String[] args){
System.out.println("H" + "a");
System.out.println('H' + 'a');
}
}
5.
public class Test5{
public static void main(String[] args){
///u0022是双引号的转义
System.out.println("a/u0022.length() + /u0022b".length());
}
}
}
6.
public class Test6{
public static void main(String[] args){
//Here:/u
System.out.println("hello");
}
}
7.
public class Test7{
public static void main(String[] args){
System.out.print("Hello ");
http://www.google.com
System.out.println("world");
}
}
//解惑
1.
public class Test1{
public static void main(String[] args){
System.out.println(2.0 - 1.1);
}
}
问题在于1.1这个数字不能被精确的表示为一个double,因此被表示为最接近它的doubl
e值,更一般的说,问题在于并不是所有的小数都可以用二进制浮点数表示。
所以在要求精确答案的地方要避免使用flaot和double,对于货币计算等尽量使用int,
long,BigDecimal。
2.
public class Test2{
public static void main(String[] args){
System.out.println(12345 + 5432l);
}
}
这题纯属娱乐···顺便给大家提个醒。
在写lang的时候最好用5432L
3.
public class Test3{
public static void main(String[] args){
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
}
}
这里牵扯到混合类型的计算,变量x被进行了二进制数字提升,有兴趣的童鞋可以搜一下
。
所以,通常最好是在条件表达式中使用类型相同的第二好第三操作数。
4.
public class Test4{
public static void main(String[] args){
System.out.println("H" + "a");
System.out.println('H' + 'a');
}
}
这个应该比较简单,字符时作为整形存储的,在运算环境下自动转换
5.
public class Test5{
public static void main(String[] args){
///u0022是双引号的转义
System.out.println("a/u0022.length() + /u0022b".length());
}
}
因为“/u0022”是双引号的转义,而Java在对字符串字面常量中的Unicode转义字符没有
提供任何特殊处理。
编译器在将程序解析成各种字符之前,先将Unicode字符转换成它们所表示的字符。
所以上面的输出语句等价于:
System.out.println("a".length() + "b".length());
6.
public class Test6{
public static void main(String[] args){
//Here:/u
System.out.println("hello");
}
}
/Unicode转义字符必须是良构的,即使出现在注释中也是如此。即/u后面必须跟着四个
十六进制数.
7.
public class Test7{
public static void main(String[] args){
System.out.print("Hello ");
System.out.println("world");
}
}
这个就是label(标号)的问题了```