黑马程序员 “+”号,一个神奇的运算符

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

这个加法运算看似简单,但是基本上都是在内存中的操作,它与你想像中的结果值可能并不一样哦。反正初学java的人会经常碰到运算符导致的一些这样那样的问题。
举个简单的例:
        class  text
         {
                 public static void main(String[] args) 
                 {
                        int x=0;
x=x++;
                        System.out.println(x);
                 }
         }

你觉得输出结果会是几呢?
是0。奇怪,就一个变量,而且执行了自增操作,加的1到哪去了?
如果我的程序是这样:
 class  text
{
        public static void main(String[] args) 
        {
                int x=0;
                while( x<5)
                {
                        x=x++;
                }
                System.out.println(x);       }
}
输出结果又是多少呢?
答案是死循环,不会有输出的。x一直都等于0。
如果你请教别人,得到的答案一般都是给你讲改成前++就不会这种问题啦,例如这个解释:
“x++和++x,单独使用的时候是没有区别的,最后输出的结果都是自己自增1的结果而如果和输出语句一起,x++ 先输出x的值,然后才会增1,而++x先自增1再输出,这就是区别”。但是,这个解释有很大的漏洞:x=x++;这是一条语句,system……;这是一条语句,为何第一条语句还没有执行完,就开始执行了第二个输出语句,然后再返回来执行第一条语句?
还有人喜欢用代码分解去解释,下面的解释仍然是错的:
“int x = 0;int temp = x;x = x+1;//x=x++  System.out.println(temp); x是先参与运算再x自增。”
以上这两种解释均没有解释那个加1操作,到底去哪了,所以都不正确。其实这就是内存机制了,执行X=X++的时候首先把0拷贝到了寄存器中,接着对变量X执行自加操作,X变成了1;但是下一步是把0从寄存器中拷贝回X的地址,所以X又变成了0。
你看,++操作并没有按你想象的去做。
“+”还经常涉及到类型转换的问题,举个例子:
1.byte b1 = 1; b1 = b1 + 1; 
2.byte b2 = 1; b2 += 1;  
3.byte b3; b3=1+1;
4.byte b=b2+b3;
猜猜运算结果是什么?
结果是第1和4条语句不通过编译?为什么啊,答案很明显啊!
因为“+”是二元运算符,只有int 、doubel、 float 等类型数据才有运算功能,所以虚拟机会将b1自动转换成int类型然后再与1相加,到这里"="右边已经是int类型了,而左边则还是byte类型,赋值“=”号是不负责强制转型的,所以虚拟机就会报类型不比配异常!第4个也是一样的问题,b2、b3被提升后,不能向下转,所以报错。
那为何3却可以呢?“1+1”也是int型,为何通过编译?因为它们不像b一样是变量,它们是一个确定的数字,在编译时期就确定了,一个确定的数向一个数据类型赋值,可能会有精度丢失的问题,但是内存是可以操作的,一个截取就了事。
那为何2也可以呢?因为“+=”它是个一元运算符,它做了3件事,提升为int,强转至byte,然后赋值,其实是一个类似 b = (type of b) (b + 1) 的缩写.
你看,“+”又没有按你想象的那样去赋值哦!
类型转换是编程中经常遇到的问题,三元运算符“?:”也可能存在向上转型的问题,一定要注意值最终的类型。说了这么多,一定要小心用“+”号哦!

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、

<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值