这是我在牛客网刷面试题的时候刷到的一道题,由于基础不扎实,所以对做这种题的时候会觉得每个答案都有点道理,模棱两可
下面的程序将来会打印什么?
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 都是一个占位符,而占位符中需要填充的内容才是我们需要注意的
-
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 进行自增操作
-
++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
运行结果:
从运行结果上看,自增运算是慢于赋值运算的,也就是说在一个表达式中,存在多个同一变量的自增运算,每一个占位符所填充的内容都不是一样的。