short i=1;
i=i+1;
上面的CODE会报一个精度损失的错误,但是下面的咋不报错?
i+=1;求教牛人解答~~

解决方案 »

  1.   

    那得研究下short与int的区别了
    楼主还是去查下书吧~~~
      

  2.   

    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加!
    i+=1;//这个不是本身+1的意思吗?这个不太明白
      

  3.   


    byte i = 0;
    i = i + 1; // 编译错误,因为自动转换int问题而出错byte i = 0;
    i += 1; // 正常编译,可以理解这是将i加上一个单位(i类型的单位)
      

  4.   

    这个就是运算符的问题,i+1返回值默认为int,当你用+作运算的时候如果2个编译器默认向类型比较大的转换,转换规则为byte->short->int->long
    这样i+1的返回值为int赋给一个short类型的变量当然就报错了,只有长度小的可以赋给长度大的, 反过来由于会丢失数据,所以不能处理,必须强制类型转换,但是i+=1则不同由于操作的变量只有i一个,所以就是在short类型的变量上自加所以能通过,如果让你向上的代码能够运行,你必须这样写
    i = (short)(i+1);这样就可以了,i+1返回int类型,就行了强制类型转换就能够赋值了
      

  5.   

    我想问的就是 i+=1;为什么不报错~~i不是byte型的而是short
      

  6.   

    short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。  
      

  7.   

    i+=1是short类型内部的自增
    而i=i+1是short类型加上一个int类型
      

  8.   

    i=i+1;//这个呢,我的理解是,short,byte,int,他们相加的时候会都转型为int类型,再相加! 
    i+=1;//这个不是本身+1的意思吗?这个不太明白
      

  9.   

    对对对就是单独的"+"出了问题,如果把语句改成这样
    short i = 1;
    i = (short)(i + 1);   //就不会报错了。这说明单独的"+"号运算,统统都会把低于四个字节的整形。
    //就是把语句改成这样i = i + i,也会报错,因为+会自动转换为int//i++或i+=1,都会自动的把进行(short)强制转换。
    另外。我都是过了不仅是单独的"+",就是"-"、"*"、"/"、"&"、"^"都会出现一样的情况!
      

  10.   

    short 不可以显示转化为 int
      

  11.   

    上面有句话没说通顺,“统统都会把低于四个字节的数据强制转换为int”
      

  12.   

    byte,short只是类型而已,对于这个问题有区别吗?呵呵。type i;
    i += 2;
    都是将i加上2个单位(i类型的单位)
      

  13.   

    我的解释是:首先,转换规则为byte->short->int->long.
    i=i+1;和i+=1; 虽然结果是一样的,
    但是i=i+1;当"i+1"这个过程发生时,编译器默认先将i给转换int了,然后在给值回short类型的i,当然报错了.(这是两个过程"转换\给值")
    而i+=1;中"+="是一个操作符,i+=1由于操作的变量只有i一个,所以就是在short类型的变量上自加.(这是一个过程"给值")
    书上这个地方都说的不怎么好,看自己怎么理解了,好象没必要抠这个,呵呵
      

  14.   

    short i=1; 
    i=i+1; //在这里会类型隐式的转化,i+1成为了整形,然后又赋值给short类型,所以会损失精度"+="是一个操作符,i+=1由于操作的变量只有i一个,所以就是在short类型的变量上自加.(这是一个过程"给值") 
      

  15.   

    答:我可以明确地说:对于i+=1;你们都是自己的想像。
    我认为,这个面试题问得好啊。很基础。
    真正的原因是:JAVA语言的规范讲得很清楚,
    E1 op= E2 完全等价于:E1 = (T )((E1) op (E2)),其中:T是E1的类型。
    因此,short i=0; i += 1 完全等价于:i = (short)( i + 1)
    另外:+ 运算符最小的类型是int。即:byte , char ,short 类型的+ ,都是统统先转成int,然后再运算的。问一下:2楼的anqini,你说的小语种是“韩语”吗?
      

  16.   

    up飞翔,学习之!《The Java™ Language Specification Third Edition》原文如下,感兴趣的同学可以参考之!
    http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5281[code=BatchFile]
    15.26.2 
    Compound Assignment Operators
    A compound assignment expression of the form E1 op= E2 is equivalent to
    E1 = (T )((E1) op (E2)), where T is the type of E1, except that E1 is evaluated
    only once.
    For example, the following code is correct:
    short x = 3;
    x += 4.6;
    and results in x having the value 7 because it is equivalent to:
    short x = 3;
    x = (short)(x + 4.6);
    [/code]
      

  17.   

    云上飞翔 的是正解
    E1 op= E2 完全等价于:E1 = (T )((E1) op (E2)),其中:T是E1的类型。
      

  18.   

    这个问题已经回答过了:
    http://topic.csdn.net/u/20070328/15/997ac129-07a9-4871-9e08-992e5f510894.html
      

  19.   

    这是一个非常经典的面试题目了,
    我都看过好多遍了。原因在于类型不统一,
    定义的是short,
    使用中却用到了int类型,
    所以导致你发生的问题。
      

  20.   

    short i=1; 
    i=i+1; //1是INT型的.I+1变成INT型.需要你强制转换一下.你可以把I设置成127试试
    上面的CODE会报一个精度损失的错误,但是下面的咋不报错? 
    i+=1; //这个会自动转型
    求教牛人解答~~
      

  21.   

    我感觉是这样的 i+1 的时候 其实是用short+int 结果会自动转换成int 而这时候再把int型的结果给short显然是不行的 因此就报错了 
    而第2个则没有出现第1个的转化 所以可以通过 
    我是这么理解的 也可能不对 大家共同学习吧
      

  22.   

    +=之类的运算符隐含强制转换。 
    s+=1 (==)s=(short)s+1; 从效果还是从实质上两者是一样的
    这个东西没必要死扣
    记住了 以后碰到了明白就是了
      

  23.   

    建议你去看看"java解惑",
    里面详解了这个题目。现帖如此:谜题9:半斤
    现在该轮到你来写些代码了,好消息是,你只需为这个谜题编写两行代码,并为下一个谜题也编写两行代码。这有什么难的呢?我们给出一个对变量x和i的声明即可,它肯定是一个合法的语句: 
    x += i;但是,它并不是: 
    x = x + i;许多程序员都会认为该迷题中的第一个表达式(x += i)只是第二个表达式(x = x + i)的简写方式。但是这并不十分准确。这两个表达式都被称为赋值表达式。第二条语句使用的是简单赋值操作符(=),而第一条语句使用的是复合赋值操作符。(复合赋值操作符包括 +=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=和|=)Java语言规范中讲到,复合赋值 E1 op= E2等价于简单赋值E1 = (T)((E1)op(E2)),其中T是E1的类型,除非E1只被计算一次。
    换句话说,复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原始类型转换。因此,我们有很好的理由去解释为什么在尝试着执行等价的简单赋值可能会产生一个编译错误。为了说得具体一些,并提供一个解决方案给这个谜题,假设我们在该谜题的两个赋值表达式之前有下面这些声明: short x = 0;
    int i = 123456;复合赋值编译将不会产生任何错误: 
    x += i; // 包含了一个隐藏的转型!你可能期望x的值在这条语句执行之后是123,456,但是并非如此l,它的值是-7,616。int类型的数值123456对于short来说太大了。自动产生的转型悄悄地把int数值的高两位给截掉了。这也许就不是你想要的了。
    相对应的简单赋值是非法的,因为它试图将int数值赋值给short变量,它需要一个显式的转型: x = x + i; // 不要编译——“可能会丢掉精度”这应该是明显的,复合赋值表达式可能是很危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量上。在将复合赋值操作符作用于int类型的变量上时,要确保表达式右侧不是long、float或double类型。在将复合赋值操作符作用于float类型的变量上时,要确保表达式右侧不是double类型。这些规则足以防止编译器产生危险的窄化转型。
    总之,复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的类型,那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢弃掉精度或数量值。对语言设计者来说,也许让复合赋值操作符产生一个不可见的转型本身就是一个错误;对于在复合赋值中的变量类型比计算结果窄的情况,也许应该让其非法才对。