java内容和地址区别_java编程细节总结(七):i++与++i的区别和java的多地址的核心概...
java编程细节总结(七):i++与++i的区别和java的多地址的核心概
java编程细节总结(七):i++与++i的区别和java的多地址的核心概念
导读:
我们对for循环相当不陌生,因为在每一个成熟的程序中,可能会利用for循环去执行一些需求语句,而i++这个我们更加不陌生。那么我们都知道for(int i=0;i
一、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的操作数值了。
java编程细节总结(七):i++与++i的区别和java的多地址的核心概相关教程
还没有评论,来说两句吧...