byte x = 5;
byte z = x - 2;
byte y = 5 - 1;上面的合法,下面的不合法。为什么啊?
下面的不合法的原因是 x 跟 整数 2 进行计算的时候,都转化为了 int类型,将 int型的计算结果赋值给 byte类型的z时,非法。那么我要问的是,难道第一个赋值的时候,5 不是当整数处理的吗?? 好那么就算如此。又怎么解释 第三行的赋值却又是合法的呢???
求高人指点。

解决方案 »

  1.   

    x
    是变量 java就这么规定 没有那么多为什么 记住就行
      

  2.   

    byte x = 5;//编译器能判断这是5,byte可以装得下
    byte z = x - 2;//x是个变量,编译器无法判断结果是什么。且byte和int做操作的时候,结果是int
    byte y = 5 - 1;编译的时候已经把5-1做掉了,等价于byte y = 4;编译器也知道4能在byte中放得下
      

  3.   

    做x-2 的时候,由于x已经声明了,而且是byte,编译器干嘛不把 2 当做byte处理呢?如果编译器像您说的知道某某在某类型中放得下的话。
      

  4.   

    是这样的,因为你上面的值是固定的,是5,5既可以是int型的数据,也可以使byte型的数据,因为这两个数据类型的范围都大于5,但是你下面的写法,即X-2,2是int型的数据,X-2自然也是int型数据,把int型数据赋予byte型是有风险的,是被系统禁止的,是要强制转换的
      

  5.   

    这涉及到基本数据类型的向上转型、向下转型,LZ可以自己去google一下,能找到很多的,向上转型与向下转型很容易理解。
      

  6.   

    byte y = 5 - 1;
    4的话,编译器可以判断,并自动转成byte。byte z = x - 1;
    编译期间判断不了,所以直接报错。强制转换可以。
    byte z = (byte)(x - 2);
      

  7.   


    表达式java在运行期才会去计算
      

  8.   

    LZ是用的eclipse吧。编译器是先判断的。如果你赋值的时候给x一个很大的数比如10000000,编译器也会报错的。