面试题
简单但容易错的题
1.自增、自减 简单题目
// 部分代码,非可运行
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
//i=? j=? k=?
这个题看着简单又凌乱的,重要的考点主要是以下几点:
“=” 右边是从左到右将加载值依次压入操作数栈;
自增自减直接修改变量的值,是在局部变量表中操作的,不经过操作数栈;
赋值是将操作数栈中的值赋给局部变量表中的,而且是最后计算的;
实际运算时,按运算符优先级计算,并将临时结果存储到操作数栈中;
题目解析:
int i = 1;
i=1;暂不解释
i = i++;
“=” 后面,从左到右将加载值依次压入操作数栈
步骤 | 局部变量表 | 操作数栈 | 说明 |
---|---|---|---|
1 | i=1 | 1 | 将局部变量表中 i=1 的值压入操作数栈中(iload_i) |
2 | i=2 | 1 | i++,i自增,局部变量表中的1加个1,变为2(iinc_i) |
3 | i=1 | 将操作数栈中的值赋到局部变量表,局部变量表中的2变为1(istore_i) |
此时i的值为1;即i=1;
局部变量表中数据如下:
i |
---|
1 |
继续下一步运算
j = i++;
自增自减直接修改变量的值,是在局部变量表中操作的
步骤 | 局部变量表 | 操作数栈 | 说明 |
---|---|---|---|
1 | i=1 | 1 | 将局部变量表中 i=1 的值压入操作数栈中(iload_i) |
2 | i=2 | 1 | i++,i自增,局部变量表中的1加个1,变为2(iinc_i) |
3 | j=1 | 将操作数栈中的值赋到局部变量表,局部变量表中的j=1(istore_j) |
此时i的值为2,即 i=2;j的值为1,即 j=1;
局部变量表中数据如下:
i | j |
---|---|
2 | 1 |
再继续下一步运算
k = i+ ++i * i++;
实际运算时,按运算符优先级计算,并将临时结果存储到操作数栈中
步骤 | 局部变量表 | 操作数栈 | 说明 |
---|---|---|---|
1 | i=2 | 2 | 将局部变量表中 i=2 的值压入操作数栈中(iload_i) |
2 | i=3 | 2 | ++i ,i自增,局部变量表中的2加个3,变为3(iinc_i); |
3 | i=3 | 2,3 | 从左到右将加载值依次压入操作数栈,将i的值压入操作数栈中,即 操作数栈又压入一个3(iload_i); |
4 | i=3 | 2,3 ,3 | i++,将i的值压入操作数栈中,即 操作数栈又压入一个3(iload_i) |
5 | i=4 | 2,3 ,3 | i++,i自增,局部变量表中的i加个1,变为4(iinc_i) |
6 | i=4 | 2,9 | 按运算符优先级计算,并将临时结果存储到操作数栈中(imul_i) |
7 | i=4 | 11 | 按运算符优先级计算,并将临时结果存储到操作数栈中(iadd_i) |
8 | k=11 | 将操作数栈中的值赋到局部变量表,局部变量表中的k=11(istore_k) |
最终计算结果:
i | j | k |
---|---|---|
4 | 1 | 11 |
// 部分代码,非可运行
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
//i=4 j=1 k=11