A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-24 01:09  /  2794 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 2012-6-25 02:41 编辑
  1. public class Test9 {  
  2.     public static void main(String[] args) {  
  3.         int i1 = 10, i2 = 10;  
  4.         System.err.println("i1 + i2 = " + i1 + i2);   
  5.         System.err.println("i1 -  i2 = " + i1 - i2);   //这个为何会编译不过?
  6.         System.err.println("i1 * i2 = " + i1 * i2);  
  7.         System.err.println("i1 / i2 = " + i1 / i2);  
  8.     }  
  9. }  
复制代码
这题的运行结果我基本都猜到了,就是不知道为什么 第二个编译不过?

这个跟优先级有关系么?

10 个回复

倒序浏览
第二行的输出语句:System.err.println("i1 -  i2 = " + i1 - i2);   
因为当虚拟机读到"i1 -  i2 = " + i1 的时候会首先将i1转换成String类型,而String类型的数据有无法和一个int类型的数据减法的运算,所以编译无法通过
第一行输出语句i1和i2则是先后的被转换成String类型的数据,第三行和第四行不难理解,*和/的优先级高于+,所以会先执行i1*i2和i1/i2的操作。
回复 使用道具 举报
楼上正解,字符串依然可以做加法的,但是结果是连接2个字符串,而不是把i1和i2的值加起来了。如第一个,应该就是i1 + i2 =1010而不是20.
由于字符串不能做减法运算,所以第二个编译会出错。
回复 使用道具 举报
System.err.println("i1 + i2 = " + i1 + i2);   //字符串的组合所以结果1010
        System.err.println("i1 -  i2 = " + i1 - i2);   //字符串和任何相加都是字符串的组合,而字符串不能相件所以不通过编译,
                                                                   //可以加个小括号,System.err.println("i1 -  i2 = " + (i1 - i2));   
        System.err.println("i1 * i2 = " + i1 * i2);  //乘和除的优先级比加高所以先计算了乘除再来和字符串组合自然就可以了

        System.err.println("i1 / i2 = " + i1 / i2);  

回复 使用道具 举报
System.err.println("i1 + i2 = " + i1 + i2);   当虚拟机读到"i1 + i2 = " + i1 的时候会首先将i1转换成String类型;+ i2转换成String类型,结果是连接2个字符串
                 
System.err.println("i1 -  i2 = " + i1 - i2);   //这个为何会编译不过?i1 -  i2 = " + i1 将i1转换成String类型,和int i2无法相减,
                 
System.err.println("i1 * i2 = " + i1 * i2);  //乘和除的优先级比高,先计算了乘除再来和字符串组合
                 
System.err.println("i1 / i2 = " + i1 / i2);
回复 使用道具 举报
现在仔细看看那个,发现真的挺简单,明白了。
回复 使用道具 举报
王月 中级黑马 2012-6-24 11:51:22
7#
1, 如果字符串和 + 相连,则这个 + 为连接符,会将字符串和后面的内容相连。
2, 所以应改为这样System.err.println("i1 - i2 = " + (i1 - i2));
回复 使用道具 举报
呵呵,不错。有意思,学习了。
回复 使用道具 举报
public class Test9 {  
    public static void main(String[] args) {  
        int i1 = 10, i2 = 10;  
        System.err.println("i1 + i2 = " + (i1 + i2));   
        System.err.println("i1 -  i2 = " + (i1 - i2));
     System.err.println("i1 * i2 = " + i1 * i2);  
        System.err.println("i1 / i2 = " + i1 / i2);  
    }  
}  这样得到的就是+-*/的结果了
i1 + i2 = 20
i1 -  i2 = 0
i1 * i2 = 100
i1 / i2 = 1
回复 使用道具 举报
System.err.println("i1 -  i2 = " + i1 - i2);   //这个为何会编译不过?
在后面的“i1 - i2”中用 + 号连接是直接转换成字符串,字符串肯定不能和后面i2进行计算了,用括号括起来就好了,i1 + i2也是不能得到正确结果的,因为是直接连接,就是10和10连接,得到1010。
回复 使用道具 举报
System.err.println("i1 -  i2 = " + i1 - i2);  //+号可以进行加法运算,也可以连接字符串,但是-号不能连接字符串,
如果改成System.err.println("i1 -  i2 = " + (i1 - i2));  让i1和i2先进行减法运算应该可以通过编译
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马