通过数据结构理解自增自减运算符
自增运算符(++)和自减运算符(–)在算术表达式中出现错误的原因,主要是:
- 自增运算符和自减运算符在变量前后的位置不一样,其内部逻辑不一样。
- 自增运算符和自减运算符只能用于变量,不能用于常量
- 要想深入理解自增和自减,我们需要了解计算机编译程序对表达式的处理过程。编译程序对表达式的处理,需要借助栈来完成,栈的特点是先进后出,计算机从左向右扫面表达式。
- 对于后置的自增或自减运算符:在进行运算时将压入栈中的数弹出来进行运算。
- 对于前置的自增或自减运算符:先将操作数进行自增或自减操作,然后再压入栈中,运算时将栈中的数弹出进行计算。
举例如下
int a = 1;
int b = 2;
int c = 0;
c = a++ + b++ + ++a;
system.out.println("a="+a+",b="+b+",c="+c);
运行结果a=3,b=3,c = 6.
分析过程如下:
①编译器从左向右扫描表达式,遇到a++,将a=1压入栈中(此时栈中存储数值为1,在计算时弹出的值为1),a加1,此时a=2;
②继续扫描,遇到b++,将b=2压入栈中(此时栈中存储数值为2,在计算时弹出的值为2),b加1,此时b=3;
③继续扫描,遇到++a,由于在第①步a已经变成2,此时先自增,a=3,再将a=3压入栈中(此时栈中存储数值为3,在计算时弹出的值为3)
④进行计算,将压入栈中的数以此弹出,分别是a=3,b=2,a=1,计算得c=6,此时a=3,b=2.
再举一个例子:
int a = 1;
a = a++;
system.out.println("a="+a);
可能有的人会认为输出结果为a = 2,这是错误的,a的值为1,我们对表达式进行分析,扫描表达式,遇到a++,将a=1压入栈中,此时a自增,变为2,进行计算,将栈中的1弹出,赋值给a,此时a的值仍然为1。
- 关键点在于判断栈中存储的值是什么,参与计算的值是存储在栈中的数据