C/C++语言中:前置++/--和后置++/--

来源:互联网 发布:帝国cms火车头视频接口 编辑:程序博客网 时间:2024/06/05 16:27


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最终的结果呢?(不同的编译器有不同的结果)

先给出测试结果,再给讲解。

VSgcc(先遍历表达式,等遍历完后寄存器带出结果)

 

理解:先存a的值给eax(值为10),临时量tmp1eax(值为10)内容,再对eax(值为10+1)内容++,临时量tmp1(值为10)

临时量tmp2tmp1(值为10)内容,再对eax(值为11+1)内容++,临时量tmp2(值为10)

临时量tmp3tmp2(值为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最终的结果呢?

同样先给出测试结果,再给讲解。

VSgcc(先遍历表达式,等遍历完后寄存器带出结果)

 

理解:先存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.

 

  1. 例子

    VS编译器:

     

    结果:

     

    解释::先遍历,表达式从右到左开始汇编代码。

    第三个:i++:返回临时量值为0eax寄存器(值为0+1)

    第二个:--i:先不返回,eax寄存器(值为1-1)

    第一个:i++:返回临时量值为0eax寄存器(值为0+1)

    遍历结束;返回变量eax(值为1).即第二个i的值为1

    所以最终结果为0,1,0.

     

     

    练习:

     

    解释:先遍历,表达式从右到左开始汇编代码。

    第四个:i++:返回临时量值为0eax寄存器(值为0+1)

    第三个:++i:先不返回,eax寄存器(值为1+1)

    第二个:i++:返回临时量值为2eax寄存器(值为2+1)

    第一个:++i:先不返回,eax寄存器(值为3+1)

    遍历结束;返回变量eax(值为4).即第一个和第三个i的值都为4

    所以最终结果为4,2,4,0.

     

原创粉丝点击