黑马程序员技术交流社区

标题: 请教一些关于运算符的问题 [打印本页]

作者: 雨过丶天已晴    时间: 2013-10-23 09:30
标题: 请教一些关于运算符的问题
第一:byte b = 1;
          b++;
         不会报错,为什么?
第二:byte b = 1;
          b+=1;
          不会报错,为什么?
第三:byte b = 1 + 1;
          不会报错,为什么?
希望大家能告诉我为什么,纠结了好久了{:soso_e149:}

作者: 寻丶丶觅    时间: 2013-10-23 09:37
没太搞清楚楼主的意思。说说我的理解吧。
首先,++ 与+=都是合理的赋值运算。
b++其实就是b=b+1; 对本身自增+1的运算。
b+=1也是b=b+1;左面等于左右相加的和。与++区别就是++只+1。+=右面的值随你写。
第三个不知道楼主疑惑的是什么.
作者: mayor125    时间: 2013-10-23 09:43
第一个:
byte b = 1;b++;   因为byte类型的数值范围是-128~127,而b++的值是2,在这个范围之内,所以不会报错。

第二个:
byte b = 1;b+=1;  这里面b+=1可以看成是b=b+1;因为前面b=1,所以b+=1的结果是2,不会报错。

第三个:
byte b = 1 + 1;  这里面变量“=”号之后就是一个相加运算,“=”在这里是赋值运算符,所以输出的结果还是2,不会报错。
作者: kellyzyb    时间: 2013-10-23 09:48
不太理解楼主的意思,是否是关于类型转换的意思呢?
首先数值做运算时,byte short char 会自动提升成int型。

b++; 和b+= 1都是对b自身进行操作,运算过程中由虚拟机做了隐式的类型自动转换动作。所以是不会报错的。

byte b = 1 + 1;
这一句的话,楼主可能相法是这样,1默认是int型,按照自动提升法则,1+1运算后为int型,int型赋给byte 为什么没有报错是吧?
实际上,如果=号右边两个都是常量的话,其值是固定的,虚拟机会判断两个相加的值是否超过byte的取值范围。byte -126-127之间,没有超过都不会报错的。
如果=号右边是变量的话,虚拟机无法判断运算后的值有没有超过范围,此时就需要强转。否则会报错。
作者: 寻丶丶觅    时间: 2013-10-23 09:54
mayor125 发表于 2013-10-23 09:43
第一个:
byte b = 1;b++;   因为byte类型的数值范围是-128~127,而b++的值是2,在这个范围之内,所以不会 ...

在编译时是不知道结果的,对于这种赋值运算,虚拟机是可以通过的,当发生溢出时,会根据该类型循环。
你可以写b+=10000.赋值运算是可以的,但是不能直接赋值超出范围 b=10000,这时候编译就会报错。
如果写成b=b+127;结果是-127.所以我们在定义数据类型时就要考虑你这个变量的取值范围,让这种溢出不会发生.
作者: 卜弦    时间: 2013-10-23 10:02
本帖最后由 卜弦 于 2013-10-23 10:06 编辑

楼主是不是看了数据类型转换部分有这些疑问的?是不是觉得等号右边是int左边是byte但是计算却没有报错是吧?
我当时看着一部分也有类似的疑问。
首先,你要明确一点,在数据范围类的一次性运算是不会存在类型转换问题的。
你问的这三种情况都是属于一次性运算。没有进行变量的存储而是只有赋值。这些情况java虚拟机会自动调整数据类型。
说具体一点:
b++对变量b而言只有一步操作b+1
b+=1也只有一步操作,把b+1的值赋给b。注意这里如果改为b=b+1,那就有两部操作,先b+1,它们的和会自动提升为int,然后再赋值,这时就会报错会损失精度。
b=1+1 更没什么好说的。
总结一点 单纯的数据运算,在不涉及变量参与时候,只要运算结果不超过数据类型范围,数据会根据存储需要自动调整数据类型。
在涉及到变量参与的运算要判断有没有数据存储在其中,因为往往会伴随着数据类型的提升。
再给你来个例子吧
byte b1=3,b2=4,b;//第一句

b=b1+b2;//第二句

b=3+4;//第三句
这三句话那句回编译出错呢? 如果你回答第二句,那恭喜你,你已经明白了。
如果还是不明白再去堪比老师视频吧。。。。。。。。



作者: 王松松    时间: 2013-10-23 10:05
其实,运算符运算分为2种情况。
1,运算符右边全为常量和运算符,这时候虚拟机可以直接知道表达式运算结果,并检查值是否在运算符左边类型值范围。不是则报错。
2,运算符右边含有变量,这时候优先级低的基本数据类型转换为优先级高的数据类型,这叫类型提升,然后参与运算,然后看是否需要强制类型转换为运算符左边的基本数据类型,即优先级高的数据类型向优先级低的数据类型转换,否则报错。

希望对你有帮助!{:soso_e141:}

作者: 1961993790    时间: 2013-10-23 10:20
这个问题不难解决,byte是:字符修饰符 byte b=1; b++;内部实现原理:这里有一个自动转换机制会按照1在内存中所对应的ASCII码对照表进行相对应的转换,所以说字节数和整数之间可以进行简单的算术运算;给你列举一个例子就可以很好的理解了:byte  a=a+1;这里在内存中是按照a所对应的ASCII码对照表在内存中对应的数字为97然后再进行加1运算最后赋值给a;第二和第三的原理也是一样的。
作者: 雨过丶天已晴    时间: 2013-10-23 12:47
卜弦 发表于 2013-10-23 10:02
楼主是不是看了数据类型转换部分有这些疑问的?是不是觉得等号右边是int左边是byte但是计算却没有报错是吧 ...

感谢大家的解答,
但是还想问问您,是不是整型类数据都需要提升为int,为什么float不需要呢?
作者: 王松松    时间: 2013-10-23 12:57
雨过丶天已晴 发表于 2013-10-23 12:47
感谢大家的解答,
但是还想问问您,是不是整型类数据都需要提升为int,为什么float不需要呢? ...

基本数据类型优先级:
double>float>long>int>byte=short=char
作者: 卜弦    时间: 2013-10-23 14:06
雨过丶天已晴 发表于 2013-10-23 12:47
感谢大家的解答,
但是还想问问您,是不是整型类数据都需要提升为int,为什么float不需要呢? ...

整数 默认为int  小数默认为double
作者: 魏-玉-彪    时间: 2013-10-23 15:45
byte   的取值范围是 127到-128.因此,

  1. byte b = 1;
  2.           b++;
  3.       
  4. byte b = 1;
  5.           b+=1;
  6.         
  7. byte b = 1 + 1;
  8.          
复制代码
三个表达式 的取值范围都在此,并且没有与其它数据类型数据进行运算,因此不报错。
  1. public class Byte{


  2.         public static void main (String args[]){
  3.        
  4.        
  5.                         byte a = 1;
  6.                                           a++;
  7.                                   
  8.                         byte b = 1;
  9.                                           b+=1;
  10.                                           
  11.                         byte c = 1 + 126;
  12.                                        
  13.         System.out.println(a);
  14.         System.out.println(b);
  15.         System.out.println(c);
  16.         }

  17. }
复制代码
如上,只要 运算结果在Byte取值范围,就会正常运行。



作者: 雨过丶天已晴    时间: 2013-10-24 12:21
卜弦 发表于 2013-10-23 14:06
整数 默认为int  小数默认为double

感谢大家,我纠结的不是这个数值默认类型的问题,请大家看看下面的两段代码:
       第一:         
                byte b;  
                byte b1= 1;
                byte b2 = 2;
                b = b1 + b2;
               报错,6楼说伴随类型提升
      第二种:
               float f;               
               float f1 = 3.1f,;
               float f2 = 3.2f;
               f = f1 + f2;
               不报错,这个又是为什么?要是有数据提升,整型提升,浮点应该也需要吧,整型提升为int,那浮点应该为double的吧
              那为什么float却没有出现错误呢?跪求大神,让我脱离苦海,当然,前面只是我的推论,还不一定成立{:soso_e153:}





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