public class Add {
public static void main(String[] args) {
short i;
i = i+1;  //报错

i+= 1;     //正确 }}请哪位牛人帮忙解答一下啊

解决方案 »

  1.   

    public static void main(String[] args) {
    short i;
    i = i+1;  //报错
       首先,i 是short  型的, 1 是int型的
         i+1的结果不回自动转换成short 所以报错。
       i+= 1;     //正确
         这个和上面表达式是一个意思,唯一不同的是
        它会把结果 隐式转换成需要的数据类型。。
            要把程序写的让别人看的很明白,就不提倡这种表达方式。
      

  2.   

    short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)
      

  3.   

    再问一下如果这样写short a;
    a = 1;是不是说把1隐式转换成了short型,然后再赋给short型的变量a呢??
    整数1是叫字面量吧,默认是int型的吗??谢谢帮忙再解释一下啊,这个问题把人真是弄糊涂了,呵呵!谢谢啦
      

  4.   


    要说问题的话,变量i没有初始化就使用还算得上个错误。至于是int还是short,这种问题编译器会告诉你错在哪里的,不同语言也有不同的处理。
      

  5.   

    这个是java中的数据类型的自动提升造成的,解决办法是加一个强制类型转化的过程
      

  6.   

    补充下二楼的解释.
    i+=1
    可以写成 i = i+1
    +优先级别比=高.
    所以会先做i+1运算
    因为1是int型,而i是short型.这个表达式会自动进行类型转换.
    i转换成int型.
    所以i+1赋值给i的时候不会出错.
      

  7.   

    问一下哈,那有数字是short型的吗?
    以前一直以为short型只是要求整数不越界就可以了
      

  8.   

    再问一下如果这样写short a;
    a = 1;是不是说把1隐式转换成了short型,然后再赋给short型的变量a呢??
    整数1是叫字面量吧,默认是int型的吗??谢谢帮忙再解释一下啊,这个问题把人真是弄糊涂了,呵呵!谢谢啦
    这个问题我也在思考,请牛人重出江湖!
      

  9.   

    两个错误,一是类型错误,1默认是int类型,二是变量未初始化.
      

  10.   

    shenpipi(皮皮) short a;
    a = 1;类型错误这个问题是可以通过的
      

  11.   

    例如
    class Test1{
    public static void main(String args[]){
    Boolean b=new Boolean("vb");
     float f=123;
     byte k=1;
     int x=(int)(1.23);
     short s=128;
     System.out.println(k);
     }
    }他会自动初始化为0,你没有在方法中使用他的时候是不报错误的,如果使用了他,如下
    class Test1{
    public static void main(String args[]){
    Boolean b=new Boolean("vb");
     float f=123;
     byte k;//报错
     int x=(int)(1.23);
     short s=128;
     System.out.println(k);
     }
    }
    但是
    byte k=1; //1不是墨认为INT吗?怎么没错误?一直没解决这问题,请牛人超人超级杀赖人出来路面
      

  12.   

    short a;
    a = 1l;不能通过召唤牛人
      

  13.   

    实验了一下
    short a = 32767;  //通过
    short b = 32768;  //can't convert int to short在初始化short变量时java根据整型常量的范围来确定它的类型?
    高手指顶
      

  14.   

    首先,在java中一个变量在使用前要对它进行初始化.
    public class Add {
      public static void main(String[] args) {
          short i;
          i = i+1; //此处是在i没有初始化的情况下就使用了i,错误.
          i+= 1;    
      }
    }
    其次,关于数据类型转换在java中有两种:
    第一种,强制类型转换,不用我多说,大家都很清楚.
    第二种,隐式类型转换,就是以上别人所说的自动类型转换.它的转换规则如下:
       基本原则:如果两者的类型不一致,则系统会自动转换为较高(即取值范围较大)的类型
       详细说明:
    (byte或short)与int型运算,转换为int型;
    (byte或short或int)与long型运算,转换为long型;
    (byte或short或int或long)与float型运算,转换为float型;
    (byte或short或int或long或float)与double型运算,转换为double型;
    char型与int型运算,转换为int型。
    不过有些我也不太理解,在32位编程下,为什么long型的与float型的进行运算却要转换成float型,而不是double型.想一想long型是8个字节,而float型只是4个字节.是否有点违返了上面的基本原则呢?求高手帮一把!!!
      

  15.   

    float 所能表示的取值范围比 long 要大 (它们的表示方法是不一样的)
    不过这个转换过程可能会丢失一定的精度
      

  16.   

    Boolean b=new Boolean("vb");
     float f=123;
     byte k;//报错
    我想问问 这段程序是对的吗?
      

  17.   

    我真服了你们了。怎么简单的问题绕来绕去的,变量有类型 常量就是常量不谈类型。比如数字1
    你说它是什么呢?有可能是char型的,也有可能是int型的还有可能是float 型的 只有变量谈类型才有意义,比如:char a='1';int a=1;float a=1;有一点要注意int型和float型变量都有最大最小范围,只要不超出范围都没问题!还有个自动类型转换的问题,那跟翻译器有关的,但基本都是差不多的,比如整型的和浮点型的在一起搞整型就转换成浮点型,一般都是向数值范围大的转,转换规则书上都是有的!
      

  18.   

    回 wangfei0206wl() ( ) 
      long型是4个字节,float型也是4个字节
      

  19.   

    i+1
    得出的结果是int整型.
    而i依然是short型.
    int整型比short是要大的类型.
    大的类型不能隐式转换成小的类型.
    若真要转换,要用强制转换
    楼主,你试下在
    i=i+1
    改成i=(short)i+1
    试试.不再回贴了.楼主不认真看书问来问去的都是一个问题!
      

  20.   

    二楼和楼上的都完全回答了楼主的问题。但是我想问一下,为什么 i+1 返回的是int型呢? 
    1是常量,而且i+1也没有超出short的返回啊!
      

  21.   

    to 搂住:没有初始化ito benewu(雪枫) 
    因为1默认的是int型,所以i(short)自动转换为int
      

  22.   

    x751125(ggg) 不知你是在哪里看的:long在java中是4个字节.据我所知,在32位编程环境下long是8个字节,int是4个字节.而在16位编程环境下int是2个字节.
      

  23.   

    比较支持x751125(ggg)的
    TO benewu(雪枫) 
    i=i+1
    i=(short)i+1//里面用了+运算符号,首先(short)i时候i为short,遇到+运算自动转换为int
    另外不是short例如char,byte一样是这么转换的
      

  24.   

    wangfei0206wl() 说的是对的,是因为i 没有初始化的原因,不是类型的问题.
      

  25.   

    1.不是初始化的问题,说是初始化的问题的人,你们怎么不调试,试一试?
    2.i = (short)i + 1;表示什么意思? i本来就是short型的,还强制什么?
      应该是i = (short)(i + 1);
      

  26.   

    A59229617() ( ) 信誉:100  2006-3-31 22:49:39  得分: 0  
     
     
       
    public static void main(String[] args) {
    short i;
    i = i+1; //报错
       首先,i 是short  型的, 1 是int型的
         i+1的结果不回自动转换成short 所以报错。
       i+= 1;     //正确
         这个和上面表达式是一个意思,唯一不同的是
        它会把结果 隐式转换成需要的数据类型。。
            要把程序写的让别人看的很明白,就不提倡这种表达方式。 
    同意 
     不过想请教二楼的,如果不初始化i,i+=1是否依然正确??
      

  27.   

    public class add {
    public static void main(String[] args) {
    short i;i=(short)(i+1);
    i+= 1;      }}//编译通不过,variable i might not have been initialized
    public class add {
    public static void main(String[] args) {
    short i=0;i=(short)(i+1);
    i+= 1;      }}//Process completed.public class add {
    public static void main(String[] args) {
    short i;
    //i=i+1;
    i+= 1;       }}//编译通不过,variable i might not have been initialized
      

  28.   

    public class add {
    public static void main(String[] args) {
    short i=0;i=i+1;
    i+= 1;      }}//编译通不过,possible loss of precision
    so 需要初始化,亦要类型转换
      

  29.   

    "meijianchi(眉间尺) 
    1.不是初始化的问题,说是初始化的问题的人,你们怎么不调试,试一试?
    2.i = (short)i + 1;表示什么意思? i本来就是short型的,还强制什么?
      应该是i = (short)(i + 1);
    "
    哈哈....
    竟然也犯了错误喀喀,把括号都忘了.
    的确应该是i = (short)(i + 1);
      

  30.   

    是初始化的问题
    这里在ECLIPSE中报了两次错
    一次是类型转换
    一次是变量初始化
    楼上的
    不防找台电脑试一试
      

  31.   


    short i;
    i = i+1; //报错i+= 1;     //正确解答:
    1.因为i=i+1;要进行类型转换 i+1会转换成int类型!右边是int,左边是short类型,所以报错!
    2.i+=1;则不进行类型转换,所以正确!
      

  32.   

    我实际测试了一下,我感觉楼上的xdjm们都在考虑变量的各种问题了,但是我发现好像这个问题跟变量没有太大的关系,真正有关系的是那个“+”!我尝试了 i = i + (short)1;理论上说,这样右边两个数都是short的,返回给i的也是short的,就没有自动的类型转换了。可是即使这样,编译还是错误,并且在cmd窗口下用javac编译的时候提示错误在+的位置上。所以,我认为,真正原因在于:+是一个要求两边都是int型或者以上的运算符。或者,只要用到+运算符的地方,所有的计算都被转换为int或者以上的计算。而楼上有人提出的 i = (short)(i + 1);这种做法是完全否定了+的自动转换,没有办法实际测试出真正原因的。
      

  33.   

    i = (short)(i + 1);行的!
      

  34.   

    short i;
    i = i+1; //报错
       首先,i 是short型的, 1 是int型的,i+1的结果是int型,而由于i是short型,将int型赋值给short型变量除非用强制类型转换,否则报错。
       i+= 1;     //正确
         “+=”是复合加,这个和上面表达式是一个意思,唯一不同的是
        它会把结果 隐式转换成需要的数据类型。。后面的贴子当中发现有些人的编码习惯不是很好。声明变量时请记得初始化。
    算术运表达式在计算时会出现自动数据类型转换。例如:short=>int=>long=>float=>double几种类型数据进行混合运算时,会出现由低到高自动转换。
      

  35.   

    尝试了一下,结论:“+”两边至少有一边应该是int或以上类型的。
      

  36.   

    这么简单的问题好像说什么的都有,回答真是千奇百怪。我来做总结性发言吧,哈哈。^_^首先,楼主的程序中变量i首定是要初始化才能使用的,不然不能编译;但我相信这是他的一个笔误,因为这不是他要问的要点。另外,Java中整数字面量都自动是int型的,比如字面量1是一个int,所以上面有人说字面量没有类型是不对的。Java规定,无论在整数赋值还是运算时,在需要窄转换(narrowing converting,即从大类型转到小类型,如int到short)的时候都必须进行显式转换(casting);但Java又规定,在进行整数字面量赋值时的转换是由编译器来进行的。所以根据上面的规定你就不难理解,为什么byte b = 1;不需要任何显式转换都可以通过编译了,因为编译器为你做了这件事。而众所周知的+=,-=等等属于复合赋值运算符(Compound Assignment Operator),顾名思义,它们是一种赋值运算符,虽然它们有算术运算等效的作用,但应该属于赋值运算的范畴,而不属于算术运算符一类。Java规定:复合赋值运算符中的转换都要编译器负责。这就是为什么你在任何情况下使用 +=,-= 等都不需要显式转换了。再来看“算术运算符(Arithmetic Operator)”。
    Java中,所有整数的算术运算都会产生int型的结果(除非有long参与其中)。所以在下面的代码中:byte b1 = 1;
    byte b2 = 3;
    byte b3 = b1 + b2;b1和b2虽然都是byte,但根据上面“所有整数的算术运算都会产生int型的结果”的规则,b1+b2却是int(虽然结果仍没有超出byte的取值范围),这样在将int赋给byte时当然需要一个显式转换。说到底,什么东西可以编译,什么东西不可以编译,完全是语言对编译器的一种规定,而这种规定完全是人为的。就像Bruce Eckel说的“早期的C编译器什么样的代码都可以编译”,这时,你就必须自己规定自己了。而目的只有一个,就是写出高效、健壮的程序。
      

  37.   

    short a;
    a = 1;
    是不是说把1隐式转换成了short型,然后再赋给short型的变量a呢??
    整数1是叫字面量吧,默认是int型的吗??在 Java 语言中,byte、short、与 char 型态就和整数、浮点数一样,有著相同的地位。
    但是,在 JVM 中,byte、short、与 char 不过是「次级公民」,指令的支援程度不及 i
    nt 和 float 的完整当你指定某值给 byte、short、或 char 的栏位时,你传给 JVM的是 int,但
    是它会自动被截短为适当的体积///////////
    我尝试了 i = i + (short)1;理论上说,这样右边两个数都是short的,返回给i的也是short的,就没有自动的类型转换了。可是即使这样,编译还是错误,并且在cmd窗口下用javac编译的时候提示错误在+的位置上。
    取出此 byte、short
    、或 char 的栏位值时,它们就会自动转型为 int 型态,然後你的程式取得的是 int 值也就是运算时是int型
      

  38.   

    "所有整数的算术运算都会产生int型的结果" true?
      

  39.   

    因为i定义为short型
    i=i+1;
    1为整型超过了i的范围;
     i=i+1
    则将i自动转化为整型所以不会出错
      

  40.   

    i为short型,i+1时进行i隐式类型转换成int型
    这之後i+1的值为int型,赋给short型的i就会出错
      

  41.   

    i = i+1; //报错 在这里 i+1是个表达式 需要一个中间寄存器保存这个结果,这个寄存器是个int型的。i+= 1;     //正确 这里是自增,自增是话,只要在i自已这个寄存器里加1便是
      

  42.   

    所有数字型的自增溢出都不会报错的,比如 int i = 2147483647; i+=1;是不会报错的,而int i = 2147483648是会的错的。
      

  43.   

    这个好像是JAVA前三堂课的内容.
    short i;//建议初始化,默认初始化为0
    i = i + 1;//首先明确,先算+,后赋值.i为short值为0,1为int.
    //通过自动类型转换,得到1类型int.即:i = 1.赋值时右侧转化为左侧.
    //int型无法强制类型转换为short型.报错.
    i += 1;//这个不是赋值,没有规定一定要右侧转化为左侧.占用内存低的向占用内存高的转化.
    //不报错.不要把+=拆开看.这是一个运算符.i += 1更接近i++而不是i = i + 1.
      

  44.   

    Dan1980(有了Eclipse,再也不用记事本编程了,Eclipse真好!-我为Eclipse设计的广告语)
    ------------------------------------------
    说的好,学习……
      

  45.   

    看过后对JAVA中的变量有了更深刻的认识。
      

  46.   

    呵呵 我自己也调试了一下,学到不少东西 多谢各位牛人和楼主
    比如:
    short i=1;
    short j=2;
    i=i+j; //报错
    i+=j;  //正确
    Dan1980 说的好
      

  47.   

    《Java编程思想》中把这样的语法现象叫做晋升
      

  48.   

    public class Add {short i;public static void main(String[] args) {
    //  short i;
    i = i+1; //报错    (还会抱错吗?)i+= 1;     //正确}}请哪位牛人帮忙解答一下啊!
      

  49.   

    楼上的,不能这么写的
    成员变量只有成员方法可以访问,除非你把它定义成static的。
      

  50.   

    public class Add {
    public static void main(String[] args) {
    short i=0;
    i+= 1;     //正确}}
    编译成class
    G:\>javap -c Add
    Compiled from "Add.java"
    public class Add extends java.lang.Object{
    public Add();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   returnpublic static void main(java.lang.String[]);
      Code:
       0:   iconst_0
       1:   istore_1
       2:   iload_1
       3:   iconst_1
       4:   iadd
       5:   i2s//自动进行类型转换了
       6:   istore_1
       7:   return}
    要问为什么自动进行类型转换,只有请教JAVA之父了