这个结果为什么不是HaHa
2009-03-14 23:50
218 查看
public class FF extends TestCase {
public void testName() throws Exception {
System.out.print("H" + "a");
System.out.print('H' + 'a');
}
}
你可能会认为这个程式将列印HaHa。该程式看起来好像是用两种方式连接了H和a,但是你所见为虚。如果你运行这个程式,就会发现它列印的是Ha169。那么,为什么它会产生这样的行为呢?
正如我们所期望的,第一个对System.out.print的调用列印的是Ha:它的参数是运算式"H"+"a",显然它执行的是一个字元串连接。而第二个对System.out.print的调用就是另外一回事了。问题在于'H'和'a'是字元型字面常量,因为这两个运算元都不是字串类型的,所以+操作符执行的是加法而不是字元串连接。
编译器在计算常量运算式'H'+'a'时,是通过我们熟知的拓宽原始类型转换将两个具有字元型数值的运算元('H'和'a')提升为int数值而实现的。从char到int的拓宽原始类型转换是将16位的char数值零扩展到32位的int。对于'H',char数值是72,而对于'a',char数值是97,因此运算式'H'+'a'等价于int常量72 + 97,或169。
public void testName() throws Exception {
System.out.print("H" + "a");
System.out.print('H' + 'a');
}
}
你可能会认为这个程式将列印HaHa。该程式看起来好像是用两种方式连接了H和a,但是你所见为虚。如果你运行这个程式,就会发现它列印的是Ha169。那么,为什么它会产生这样的行为呢?
正如我们所期望的,第一个对System.out.print的调用列印的是Ha:它的参数是运算式"H"+"a",显然它执行的是一个字元串连接。而第二个对System.out.print的调用就是另外一回事了。问题在于'H'和'a'是字元型字面常量,因为这两个运算元都不是字串类型的,所以+操作符执行的是加法而不是字元串连接。
编译器在计算常量运算式'H'+'a'时,是通过我们熟知的拓宽原始类型转换将两个具有字元型数值的运算元('H'和'a')提升为int数值而实现的。从char到int的拓宽原始类型转换是将16位的char数值零扩展到32位的int。对于'H',char数值是72,而对于'a',char数值是97,因此运算式'H'+'a'等价于int常量72 + 97,或169。
相关文章推荐
- 这个代码为什么输出不是正确结果
- 为什么php中echo intval((0.1+0.7)x10) 结果为7而不是8
- 在"Select top 2 * from news order by count"进行筛选时,如果count值有重复时,则筛选结果将不是2条记录,这个问题该怎么解决?
- 请电脑大神来看看我的输入法输入问题,按了U,I,O,P,J,K,L,M这些键为什么不是UIOPJK 这个是某些笔记本的设定,
- 昨天刚看了Handler和HandlerThread这个东西,不明白为什么要用这么复杂的东西,而且Handler直接post的话好像还不是子线程运行。那我再开发的时候直接用Thread行不行?两个有什么区别?
- 这个程序的结果为什么会这样 ?
- 为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了
- 为什么php中echo intval((0.1+0.7)*10) 结果为7而不是8?
- Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?
- 为什么你不是优秀的人?是这个原因么?
- 奇怪的析构函数,不知道为什么这个运行结果
- 为什么公司里个个都很负责,结果却不好呢?作为管理者如何解决这个问题?
- 这个电路输出为什么不是2.5V?
- db4o这个对象数据库有很多优点,但为什么不是很火? 大家有没有用过db4o的?
- 为什么 Android 上跑虚拟机这个主意不是特别理想
- 为什么这个程序中sizeof的结果是4…
- SQL> select LTRIM('Mississippi','Mis') from dual; LTR --- ppi 为什么结果是ppi而不是sissipi?!
- 创业板,为什么上市?有这个必要吗?创业板?为什么不是中小板或主板
- 为什么Java的string类要设成对象,其他的基本类型为什么不是对象
- 为什么要使用SLF4J而不是Log4J