理解局部变量表和操作数栈对理解自增运算很有帮助
要点:
- 赋值= 最后运算
- =右边从左到右一次加载值压入操作数栈(z这一操作其实可以理解为将符号引用转换成直接引用,不涉及其他算术运算符的具体运算,除了自增运算会直接更新局部变量表,不经过操作数栈)
- 现在=右边是只有操作数和运算符形式的算式,具体先算哪个,看算术运算符优先级
- 最终赋值之前,临时计算结果也储存在操作数栈中
举例:
public class Test{
public static void main(String[] args){
int i=10;
/*
*首先将i=10压入操作书栈,然后自增,局部变量表中i=11,
*然后将操作数栈中的10再赋值给i,所以i=10;
*/
i=i++;
/*
*首先将i=10压入操作数栈,然后自增,局部变量表中i=11,
*然后将操作数栈中的10赋值给j,j=10;
*/
int j=i++;
/*
*首先将第一个i=11压入操作数栈
*然后第二个i是++i,先自增,局部变量表中的i=12,再将12压入操作数栈
*第三个i是i++,先将12压入操作数栈,然后自增,局部变量表中i=13
*然后计算k=11+12*12=155
*所以i=13,j=10,k=155;
*/
int k=i+ ++i*i++;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
}
朴实无华的分割框,下面是以前内容,上面时精辟内容
其实很简单,记住要点就可以了
i++,i先进行操作或运算后,自增1
++i,i先自增1,再进行操作或运算
举例:
int i=0;
System.out.println(i++);
上面这个例子输出为0
解释:i++,i先进行操作,本例中的操作就是输出了,所以先输出0,然后i自增1.
int i=0;
System.out.println(++i);
上面这个例子,输出为1
解释:++i先自增,变为1,再进行操作也就是输出了,所以输出1.
朴实无华的分割框,下面是以前内容,上面时精辟内容
/**
*
* <p>Title: 算术运算符++ -- 一道题搞清楚</p>
* <p>Description: 原则:
* ++ 在前面时,先让a自增,再参与运算或者输出
++ 在后面时,先让a参与运算或者输出,再自增
从左往右计算,遇到括号先算括号里的
* </p>
* @author Chill Lyn
* @date 2019年9月21日
*/
public class test {
public static void main(String[] args) {
int a = 10;
int b = 9;
int c = 8;
int d = 7;
int result = 0;
result = a-- + ++c - b-- + d++ - (--a - d++) - b++ - --c;
/*
* a--+ ++c=10+9=19 a=9 b=9 c=9 d=7;
* result=19-b--+d++- (--a-d++)-b++- --c;
* 19-b--+d++=19-9+7=17 a=9 b=8 c=9 d=8;
* result=17- (--a-d++)-b++- --c;
* 17-(--a-d++)=17-(8-8)=17 a=8 b=8 c=9 d=9;
* result=17-b++- --c=17-8-8=1;
* a=8 b=9
* c=8 d=9
*/
System.out.println(result);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
console:
1
8
9
8
9