c语言++i和i++有什么区别
c语言++i和i++的区别是:1.用于赋值语句,i++先赋值后加1,++i先加1后赋值; 2. 用于判断条件表达式:如a、i++:先执行判断后加1;b、++i:先加1后执行判断。
自行打印printf("%d %d",i++,--i);这一行代码,会发现编译器给出的值和我们所想象中是不一样的,我将从汇编的角度对前置++与后置++做一个简单的解释。
普遍化的解释:
后置加加:先取值,然后再加加
前置加加:先加加,再取值。
这三句汇编中执行了–操作,说明,printf函数中,两个i,先计算–i,然后计算i++.
这三句话做了一下的事情:
1.将i从内存中取出来,然后存入到寄存器中。
2.将寄存器中的值-1。
3.将寄存器中减过1得值存入到内存地址中去。
总结:前置减减,是对值做了减操作后,将其存入到原来的位置。
上面代码完成了下面几件事情:
1.将值从内存中取出来放入到寄存器中。
2.将内存器的值放入到临时变量中去。
3.将值从内存中再次取出来,放入到另一个寄存器中去。
4.给第二个寄存器加一。
5.将加一后的寄存器中的值放回到原地址中去。
总结:后置加加将值先放入到临时变量中,然后再做前置加加的事情。
然后,编译器将针对printf这个函数,进行一个压栈的操作。请注意压栈的顺序:
这里四句代码做了下面几件事:
1.首先从内存上取i的值,放入到寄存器中,将寄存器中压栈。
2.将刚才生成的临时变量的值,放入到另一个寄存器中,将该寄存器压栈。
函数参数的入栈过程一直保持着从右向左入栈的顺序。刚才已经分析,后置加加操作,将i先取出放入临时变量中,此刻后入临时变量的值,那么说明入栈过程一直保持着从右向左入栈的顺序。
注意:前置减减操作完成后,入栈的i值是直接从内存中取值,凡是遇到前置加加或减减操作,其取值都是从内存中直接取值,此刻内存中的值,是对i全部计算完成之后的值。
按照上面的分析过程,可以分析printf(”%d %d %d %d\n”,i++,i–,–i,++i)。