变量自增
public class Test1 {
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i + ++i * i++;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
}
答案:4 ,1 ,11
总结:自增在表(局部变量表)中,赋值在栈(操作数栈)中。
计算方式
自己理解
- 第一种:这种是我自己理解的一种比较主观的方法,比如这种i++,++在后面的我们首先要看他计算的结果是要给自己赋值还是要给其他变量赋值。
//如果是给自己赋值 比如
int i = 1;
i=i++;
System.out.println(i);
//那么 最后输出 的 i 等于 1。
总结:如果自增是给自己赋值那么自增会失败
- 第二种:给其他变量赋值。
//给其他变量赋值
int j = i++;
System.out.println(i);
System.out.println(j);
//最后输出结果 2 1
总结:如果自增是给其他变量赋值那么自增会成功
以上两种情况只适用于 单个表达式的自增。
正确方式
变量的自增分为两个区域 局部变量表 和 操作数栈
public static void main(String[] args) {
int i = 1;
i = i++;
/*
1.首先看等号右面 ++ 在后面将i放入操作数栈
局部:int i = 1 操作: 1
2.进行++操作
局部:int i = 2 操作: 1
3.进行赋值操作,将操作是栈中的值赋给=左面
*/
int j = i++;
/*
1.首先看等号右面 ++ 在后面将i放入操作数栈
局部:int i = 1 操作: 1
int j = 0
2.进行++操作
局部:int i = 2 操作: 1
int j = 0
3.进行赋值操作,将操作是栈中的值赋给=左面
局部:int i = 2 操作: 1
int j = 1
*/
int k = i + ++i * i++;
/*
1.首先看等号右面 ++ 在后面将i放入操作数栈
局部:int i = 2 操作: 2
int k = 0
2.进行++操作,第二个表达式++在前面,直接自增放入栈中
局部:int i = 3 操作: 2
: 3
int k = 0
3.进行++操作,第三个表达式++在后面,先将变量值放入栈中然后再自增
局部:int i = 4 操作: 2
: 3
: 3
int k = 0
4.进行赋值操作,将操作是栈中的值赋给=左面
将操作数栈中的结果赋给k
*/
System.out.println(i);
System.out.println(j);
System.out.println(k);
}