C/C++语言中:前置++/--和后置++/--
C/C++语言中:前置++/--和后置++/--
int a = 0;
a++/a--:前置a是常量。先使用a的值,再对a进行++/--操作。使用时返回的a是临时量.
这里就不麻烦的出现汇编代码了,也不大容易看懂。理解汇编,懂它干了什么就可以了。
前置操作:先去取a原来的地址四个字节存入eax寄存器,把eax的值存入临时变量中,返回。再对eax寄存器中的内容进行++/--操作。
int b = 0;
++b/--b:后置b是变量。先对b进行++/--操作,再使用b的值。使用时返回的b变量本身.
同样不出现汇编代码。下面就是理解:
后置操作:先去取b原来的地址四个字节存入eax寄存器,再对eax寄存器中的内容进行++/--操作,通过eax寄存器把b值返回。
一.后置操作例子:
Int a = 10;
(a++)+(a++)+(a++)结果是多少?a最终的结果呢?(不同的编译器有不同的结果)
先给出测试结果,再给讲解。
VS和gcc下(先遍历表达式,等遍历完后寄存器带出结果)
理解:先存a的值给eax(值为10),临时量tmp1存eax(值为10)内容,再对eax(值为10+1)内容++,临时量tmp1(值为10)。
临时量tmp2存tmp1(值为10)内容,再对eax(值为11+1)内容++,临时量tmp2(值为10)。
临时量tmp3存tmp2(值为10)内容,再对eax(值为12+1)内容++,临时量tmp3(值为10)。
表达式结束,三个临时量被返回。
(a++)+(a++)+(a++)最终结果:tmp1+tmp2+tmp3 = 10+10+10 = 30;
a最终结果:是eax中内容值13。
二.前置操作例子:
Int a = 10;
(++a)+(++a)+(++a)结果是多少?a最终的结果呢?
同样先给出测试结果,再给讲解。
VS和gcc下(先遍历表达式,等遍历完后寄存器带出结果)
理解:先存a的值给eax(值为10),再对eax(值为10+1)内容++,此时eax(值为11)内容;
再对eax(值为11+1)内容++,此时eax(值为12)内容;
再对eax(值为12+1)内容++,此时eax(值为13)内容;
表达式结束,三个变量通过eax寄存器被返回。
(a++)+(a++)+(a++)最终结果:a+a+a = 13+13+13 = 39
a最终结果:就是eax带回的变量内容,即a = 13.
-
例子
VS编译器:
结果:
解释::先遍历,表达式从右到左开始汇编代码。
第三个:i++:返回临时量值为0,eax寄存器(值为0+1);
第二个:--i:先不返回,eax寄存器(值为1-1);
第一个:i++:返回临时量值为0,eax寄存器(值为0+1);
遍历结束;返回变量eax(值为1).即第二个i的值为1。
所以最终结果为0,1,0.
练习:
解释:先遍历,表达式从右到左开始汇编代码。
第四个:i++:返回临时量值为0,eax寄存器(值为0+1);
第三个:++i:先不返回,eax寄存器(值为1+1);
第二个:i++:返回临时量值为2,eax寄存器(值为2+1);
第一个:++i:先不返回,eax寄存器(值为3+1);
遍历结束;返回变量eax(值为4).即第一个和第三个i的值都为4。
所以最终结果为4,2,4,0.