java中的i++与++i问题 详细,看完你就明白了

i++ 与 ++i

i++:先参与运算,再自加1;
++i:先自加1,再参与运算;
看似简单的两句话,其实实际情况有点复杂,让我们看看下面例子:

int i = 1;
i = i++;
//运行结果:i = 1;

对于上述例子相信网上搜一搜可以看到很多答案,但对于刚入门的小白来说可能有点看不懂,接下来我就用比较容易理解的话解释:关于 i = i++,首先 i 的值 1 会先压一个叫本地方法栈的地方,而 i 自身会在其所在的本地变量表中自加1,接着栈中的1会赋值给 i ,也就是说 i 其实是先变成了2,然后又被栈中的1覆盖,结果就是i = 1。这里可以这样理解:凡是运算,变量的值都会先压入栈中,然后用栈中的值去参与运算,而++的优先级又最高,所以++总是先完成的。
在这里插入图片描述
让我们看看下面这个例子,看完后就全明白了。

//有关i++ 与 ++i 的测试
public class ITest {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i = 1;
		i=i++;//变量i的值1会先压入本地方法栈中,然后i在本地变量表中自增1变为2,最后再从栈中取出1赋值给i
		System.out.println(i);
		System.out.println("-----------------");
		
		System.out.println(i);//i = 1;
//		从左到右,i++,因为是后加加,所以i的值1会先压入本地方法栈,i自增1变为2;
//		接着++i,因为是前加加,所以i的值2会先自增为3,再压入栈中;
//		接着i++,i的值3先压入栈中,i再自增变为4;
//		接着++i,i的值4会先自增为5,再将5压入栈中;
//		最后,栈中的值1,3,3,5进行求和,赋值给a。
		int a = i++ + ++i + i++ + ++i;
		System.out.println("a=" + a + "  i=" + i);
		System.out.println("-----------------");
		
		//因为++的优先级大于比较或赋值,所以自增总是发生在比较或赋值运算之前的!!!
		System.out.println(i);
		if(++i == i){//从左到右,左边i的值先自增,然后把自增完的值入栈,右边把i(此时i已自增)的值入栈,栈中值进行比较,相同
			System.out.println(99999);
		}
		System.out.println(i);
		if(i == ++i){//从左到右,左边i的值先入栈,右边i的值先自增再入栈,栈中值进行比较,所以i值不相同
			System.out.println(888888);
		}
		
		System.out.println("--------------------");
		System.out.println(i);
		if(i++ == i){//从左到右,左边i的值先入栈,再自增,右边i的值(此时i已自增)入栈,栈中值进行比较,不相同
			System.out.println(55555555);
		}
		System.out.println(i);
		if(i == i++){//从左到右,左边i的值入栈,右边i的值先入栈,再自增,栈中值进行比较,相同
			System.out.println(11111111);
		}
		System.out.println(i);
	}
}

在这里插入图片描述
在这里插入图片描述
所以就是这样了,纠结这个问题挺久了,总算是告一段落了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值