java编程细节总结(七):i++与++i的区别和java的多地址的核心概念

导读:

      我们对for循环相当不陌生,因为在每一个成熟的程序中,可能会利用for循环去执行一些需求语句,而i++这个我们更加不陌生。那么我们都知道for(int i=0;i<n;i++)这样类型的for循环的格式,那么为什么不用for(int i=0;i<n;++i)呢?同时,为什么在执行某变量赋值语句i += i++输出的只是2i的值呢?这些都是在此博客里一一解释的。


一、i++和++i的区别

1.i++

         首先看下如下简单程序遇到的i++坑

	public static void main(String[] args) {
		int i = 5;
			if(i++ >5){ 
				System.out.println("这个是"+i);
			}
			else{
				System.out.println("==========" + i);
			}
	}

      大家 下意识肯定会觉得输出的是else部分,是的答案没错,但是输出的并不是5而是6

     为什么呢?我们都知道实际上i++是一个可以被称为程序执行完加操作的语句,其实这不完全是对的。i++>5?这个例子可以拆分为两个java指令,第一个是i>5?  第二个是i+=1  。显而易见,所以输出的是else当然没错,因为初始化的i确实不为5,同时输出的else是6也是没错,因为已经执行了i+1操作。

     所以说,我们可以称i++是执行完某项指令在进行的加操作,这里的例子就是比较指令,在if语句中执行完i>5的语句操作后进行值+1。同时,i++是一个简化的java语句,在java内部中可能实现了多指令的简化操作。

 2.++i

        依然是上面这个例子,

	public static void main(String[] args) {
		int i = 5;
			if(++i >5){ 
				System.out.println("这个是"+i);
			}
			else{
				System.out.println("==========" + i);
			}
	}

答案

 显然++i和i++是有所不同的,如果说i++>5?可以分为的步骤是i>5?   i =i+1  

同理,++i  就是  i=i+1    i>5? 

所以答案也很明显了,i先进行+1操作,在后进行比较操作,所以6>5执行的是true指令,执行结果是正确的。

这个比较就是很明显的总结:

i++:执行 完某项指令执行加操作。

++i:执行前进行加操作,在执行后面的指令操作。


二、java多地址的现象

   我们看如下的程序

	public static void main(String[] args) {		
		int i = 5;
		i += i++;
		System.out.println(i);
	}

我们来根据上面所学的内容来进行这个例子的解答。我相信很多人都会下意识的说11这个答案。理由都是:这个不就是先根据执行的先后顺序吗?所以就是先i++然后i+6,答案是11呀!

答案是否定的。

这个是为什么呢??

其实我们耐心的观察和思考就会发现,java是一种面向对象的语言,所以如果是一个简单的变量值,它使用的地址永远唯一就不会出现上面情况,所以很明显,java是多地址的。

如图所示

也就是说,这两个i的操作都是不同的地址,所以得到的值是分开的,这个就是java中的多地址情况,最后我们输出的虽然是10,但是i++操作为6不可避免,虽然它执行了,但是它占用的是其中的另一块地址,我们现在输出的是最后一块的地址(离自己最近的),所以当然是进行过i+=i的操作数值了。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值