java常见面试题1

面试题

简单但容易错的题

1.自增、自减 简单题目

// 部分代码,非可运行
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
//i=? j=? k=? 

这个题看着简单又凌乱的,重要的考点主要是以下几点:

“=” 右边是从左到右将加载值依次压入操作数栈;
自增自减直接修改变量的值,是在局部变量表中操作的,不经过操作数栈;
赋值是将操作数栈中的值赋给局部变量表中的,而且是最后计算的;
实际运算时,按运算符优先级计算,并将临时结果存储到操作数栈中;

题目解析:

int i = 1; 

i=1;暂不解释

i = i++; 

“=” 后面,从左到右将加载值依次压入操作数栈

步骤局部变量表操作数栈说明
1i=11将局部变量表中 i=1 的值压入操作数栈中(iload_i)
2i=21i++,i自增,局部变量表中的1加个1,变为2(iinc_i)
3i=1将操作数栈中的值赋到局部变量表,局部变量表中的2变为1(istore_i)

此时i的值为1;即i=1;
局部变量表中数据如下:

i
1

继续下一步运算

j = i++;

自增自减直接修改变量的值,是在局部变量表中操作的

步骤局部变量表操作数栈说明
1i=11将局部变量表中 i=1 的值压入操作数栈中(iload_i)
2i=21i++,i自增,局部变量表中的1加个1,变为2(iinc_i)
3j=1将操作数栈中的值赋到局部变量表,局部变量表中的j=1(istore_j)

此时i的值为2,即 i=2;j的值为1,即 j=1;
局部变量表中数据如下:

ij
21

再继续下一步运算

k = i+ ++i * i++;

实际运算时,按运算符优先级计算,并将临时结果存储到操作数栈中

步骤局部变量表操作数栈说明
1i=22将局部变量表中 i=2 的值压入操作数栈中(iload_i)
2i=32++i ,i自增,局部变量表中的2加个3,变为3(iinc_i);
3i=32,3从左到右将加载值依次压入操作数栈,将i的值压入操作数栈中,即 操作数栈又压入一个3(iload_i);
4i=32,3 ,3i++,将i的值压入操作数栈中,即 操作数栈又压入一个3(iload_i)
5i=42,3 ,3i++,i自增,局部变量表中的i加个1,变为4(iinc_i)
6i=42,9按运算符优先级计算,并将临时结果存储到操作数栈中(imul_i)
7i=411按运算符优先级计算,并将临时结果存储到操作数栈中(iadd_i)
8k=11将操作数栈中的值赋到局部变量表,局部变量表中的k=11(istore_k)

最终计算结果:

ijk
4111
// 部分代码,非可运行
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
//i=4 j=1 k=11 
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值