Java中 i++与++i 的执行顺序

这是我在牛客网刷面试题的时候刷到的一道题,由于基础不扎实,所以对做这种题的时候会觉得每个答案都有点道理,模棱两可

下面的程序将来会打印什么?

public class TestIncr{
		public static void main(String[] args){
				int i = 0;
				i = i++ + i;
				System.out.println("I =" + i);
		}
}

A、I = 1
B、I = 2
C、I = 3
D、编译出错

答案:A

对于自增运算,老师上课的时候都会说,i++是先计算再自增,而++i是先自增再计算。

这里我们不妨假设 i++/++i 都是一个占位符,而占位符中需要填充的内容才是我们需要注意的

  1. i++ 应该填充什么

    public class test {
        public static void main(String[] args) {
            int i = 1;
            int j = (i++) + 1;
            System.out.println("j = " + j);
        	System.out.println("i = " + i);
        }
    }
    

    运行结果:
    在这里插入图片描述

    这里我们可以看到,运行结果为2,结合小学的数学知识可以得出 i++ 在运算中的值为 1,也就是初始化的值,可以得出结论,i++占位符所放的内容为 i 的值,并且在运算结束后才会对 i 进行自增操作

  2. ++i 应该填充什么

    public class test {
        public static void main(String[] args) {
            int i = 1;
            int j = (++i) + 1;
            System.out.println("j = " + j);
            System.out.println("i = " + i);
        }
    }
    

    运行结果
    在这里插入图片描述
    同样,最后 j 的值为3,可得 ++i 占位符的位置填充的是 2,也就是在填充到表达式之前 i 已经完成了自增运算。

接下来会出现一个疑惑的点,上面的面试题中的表达式 i = i++ + i;
1、先进行赋值运算,再进行自增运算,即 i++ 等到表达式执行完成再进行自增。
假设这种情况成立,则表达式中 i++i 的值都为0,所以将0赋给i,i 再进行自增运算,因此最后结果为1

2、先进行自增运算,再进行赋值运算,即 i++ 在赋值运算之前已经完成。
假设这种情况成立,则表达式中 i++ 为 0,i 为1,所以最后的结果也为1。

如果仅仅从这个表达式中,我们是不能知道 自增运算和赋值运算之间到底谁先执行,谁后执行。
所以设计以下程序来验证两个运算的执行顺序

public class test {
    public static void main(String[] args) {
        int i = 1;
        int j = (i++) + i;
        System.out.println("j = " + j);
        System.out.println("i = " + i);
    }
}

如果是先进行赋值操作,后进行自增操作,j 的值应该是 1 + 1 = 2
而先进行自增运算,再进行赋值运算,j 的值应该是 1 + 2 = 3
运行结果:
在这里插入图片描述
从运行结果上看,自增运算是慢于赋值运算的,也就是说在一个表达式中,存在多个同一变量的自增运算,每一个占位符所填充的内容都不是一样的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值