黑马程序员技术交流社区

标题: +-*/的一个小问题! [打印本页]

作者: 余银桂    时间: 2012-6-24 01:09
标题: +-*/的一个小问题!
本帖最后由 余银桂 于 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. }  
复制代码
这题的运行结果我基本都猜到了,就是不知道为什么 第二个编译不过?

这个跟优先级有关系么?
作者: 吴扬    时间: 2012-6-24 01:13
第二行的输出语句:System.err.println("i1 -  i2 = " + i1 - i2);   
因为当虚拟机读到"i1 -  i2 = " + i1 的时候会首先将i1转换成String类型,而String类型的数据有无法和一个int类型的数据减法的运算,所以编译无法通过
第一行输出语句i1和i2则是先后的被转换成String类型的数据,第三行和第四行不难理解,*和/的优先级高于+,所以会先执行i1*i2和i1/i2的操作。
作者: 黑马-许泽宇    时间: 2012-6-24 02:19
楼上正解,字符串依然可以做加法的,但是结果是连接2个字符串,而不是把i1和i2的值加起来了。如第一个,应该就是i1 + i2 =1010而不是20.
由于字符串不能做减法运算,所以第二个编译会出错。
作者: 陆强强    时间: 2012-6-24 07:29
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);  


作者: 张华廷    时间: 2012-6-24 11:00
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:43
现在仔细看看那个,发现真的挺简单,明白了。
作者: 王月    时间: 2012-6-24 11:51
1, 如果字符串和 + 相连,则这个 + 为连接符,会将字符串和后面的内容相连。
2, 所以应改为这样System.err.println("i1 - i2 = " + (i1 - i2));

作者: 陈淑飞    时间: 2012-6-24 11:52
呵呵,不错。有意思,学习了。

作者: 赵庆礼    时间: 2012-6-24 12:07
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

作者: 封明川    时间: 2012-6-24 23:04
System.err.println("i1 -  i2 = " + i1 - i2);   //这个为何会编译不过?
在后面的“i1 - i2”中用 + 号连接是直接转换成字符串,字符串肯定不能和后面i2进行计算了,用括号括起来就好了,i1 + i2也是不能得到正确结果的,因为是直接连接,就是10和10连接,得到1010。
作者: 李伟    时间: 2012-6-25 00:17
System.err.println("i1 -  i2 = " + i1 - i2);  //+号可以进行加法运算,也可以连接字符串,但是-号不能连接字符串,
如果改成System.err.println("i1 -  i2 = " + (i1 - i2));  让i1和i2先进行减法运算应该可以通过编译




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2