| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2825 人关注过本帖
标题:x+=y和x=x+y有什么不同?
只看楼主 加入收藏
hurtsky
Rank: 1
等 级:新手上路
帖 子:90
专家分:0
注 册:2008-7-10
结帖率:100%
收藏
 问题点数:0 回复次数:13 
x+=y和x=x+y有什么不同?
x+=y和x=x+y有什么不同?
不知道大家有没有这样的经历,有时候用x+=y不会出现类型转换错误,而x=x+y就会.
2008-07-29 20:34
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
的确,有一段程序:
byte x = 1, y = 2;
x += y;
x = x + y;
红色的那行就会提示不能从int转换成byte,除非强制转换
因为Java中,整型相加,结果会自动默认为int型的,如果加数是byte和short的,不能自动转换为int型,但是如果是int和long型的就不会出现这种错误了

I'm here, as always...
2008-07-30 09:07
hurtsky
Rank: 1
等 级:新手上路
帖 子:90
专家分:0
注 册:2008-7-10
收藏
得分:0 
上面那位还是没有说明原因,请问为什么用“+=”可以,可不可以具体说明一下?
2008-07-30 19:43
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
+= 和 = 的区别,= 右边先计算好结果再给左边,算好结果会默认为int型的,但左边如果是byte和short型的变量就会出现无法转换的问题,但是+=就是直接将结果赋给左边,没有默认为int型这一步

I'm here, as always...
2008-07-31 09:30
hurtsky
Rank: 1
等 级:新手上路
帖 子:90
专家分:0
注 册:2008-7-10
收藏
得分:0 
谢了
2008-07-31 18:49
YCVSCY
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2008-7-11
收藏
得分:0 
受教了,以前还不知道那两个东东还有区别.
2008-07-31 22:36
msi110
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-4-15
收藏
得分:0 
原来如此··········
受教了···
2008-08-16 19:23
lzrzhao
Rank: 1
来 自:BJ
等 级:新手上路
帖 子:37
专家分:5
注 册:2006-5-22
收藏
得分:0 
类型会自动转换的
也有转换规则的

路漫漫其修远,吾将上下而求索
2008-08-19 10:15
liun5210
Rank: 1
来 自:湖北省天门市
等 级:新手上路
帖 子:55
专家分:0
注 册:2008-5-12
收藏
得分:0 
原来如此啊!谢拉!
2008-08-20 18:28
时空之蕊
Rank: 2
等 级:新手上路
威 望:3
帖 子:691
专家分:0
注 册:2004-10-31
收藏
得分:0 
[bo][un]hwoarangzk[/un] 在 2008-7-31 09:30 的发言:[/bo]

+= 和 = 的区别,= 右边先计算好结果再给左边,算好结果会默认为int型的,但左边如果是byte和short型的变量就会出现无法转换的问题,但是+=就是直接将结果赋给左边,没有默认为int型这一步


个人不赞成这种理解方式:
1 无论=还是+=都会发生类型转换
2 应该只是语法检测问题,对于+=实际也是 x += y; <==> x = x+ y;知识jvm在解析

测试代码
public class Test {
    private static byte x,y;
    public static void main(String[] args) {
        x = 2; y = 3;
        x += y;
        x = 2; y = 3;
        x = (byte) (x + y);
    }
}
编译后的代码是:
// Compiled from Test.java (version 1.5 : 49.0, super bit)
public class Test {
  
  // Field descriptor #6 B
  private static byte x;
  
  // Field descriptor #6 B
  private static byte y;
  
  // Method descriptor #9 ()V
  // Stack: 1, Locals: 1
  public Test();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [11]
    4  return
      Line numbers:
        [pc: 0, line: 1]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: Test
  
  // Method descriptor #18 ([Ljava/lang/String;)V
  // Stack: 2, Locals: 1
  public static void main(java.lang.String[] args);
     0  iconst_2
     1  putstatic Test.x : byte [19]
     4  iconst_3
     5  putstatic Test.y : byte [21]
   [bo]  8  getstatic Test.x : byte [19]
    11  getstatic Test.y : byte [21]
    14  iadd
    15  i2b
    16  putstatic Test.x : byte [19]
[/bo]
    19  iconst_2
    20  putstatic Test.x : byte [19]
    23  iconst_3
    24  putstatic Test.y : byte [21]
    [bo]27  getstatic Test.x : byte [19]
    30  getstatic Test.y : byte [21]
    33  iadd
    34  i2b
    35  putstatic Test.x : byte [19]
[/bo]
    38  return
      Line numbers:
        [pc: 0, line: 4]
        [pc: 8, line: 5]
        [pc: 19, line: 6]
        [pc: 27, line: 7]
        [pc: 38, line: 8]
      Local variable table:
        [pc: 0, pc: 39] local: args index: 0 type: java.lang.String[]
}

x += y; 实际是红色代码
x = (byte) (x + y);  实际是淡红色代码
我们可以看到他们完全一致,可以想象他们都是完全相同的代码只是x = x + y;无法通过编译器检测,不过他的效果确实是x += y <==> x = x + y

[[it] 本帖最后由 时空之蕊 于 2008-8-21 21:36 编辑 [/it]]

我渴望掌控时空的核心——用最先进的技术,打造无比美丽的世界!
2008-08-21 21:32
快速回复:x+=y和x=x+y有什么不同?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018790 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved