浅析那些初学者头疼i++,i–,-i–等自增自减运算符
开篇问题:
#include<stdio.h>
int main()
{
int i = 8;
printf("%d %d %d %d %d %d",++i,--i,i++,i--,-i++,-i--);
return 0;
}
请小伙伴们观察并写出以上代码执行的结果。
根本原因:
自增自减运算符分为两类,分别是右值和左值。形如i++,i–,-i之类的便是右值,遇到右值会将递增前的i的值给记录下来,向前传递递增之后的值。形如–i,++i,i之类的便是左值。左值会直接向前传递递增之后的值,但并不会记录i的值,只记录i的地址,直到所有表达式出栈之后,在将i的最终值代入。编译器遇到右值会直接压栈,遇到左值则会把i的地址进行压栈。
开篇问题的解析:
printf函数里面从右向左进行压栈。
栈顶 | 栈底 | ||||
---|---|---|---|---|---|
++i | –i | i++ | i– | -i++ | -i– |
左值直接向前传递递增之后的数值8,但是仍旧记录i的地址,已到栈顶开始出栈 | 左值直接向前传递递减之后的数值7,但是仍旧记录i的地址 | 记录数值7,向前传递数值8. | 记录数值8,向前传递数值7. | 记录数值-7,向前传递8. | 此处初始i的值为8,记录-i的值-8,向前传递i++后的值7。 |
i | i | 7 | 8 | -7 | -8 |
最终i的值为8,依次出栈。所以从前到后依次输出:8,8,7,8,-7,-8
.
注意:上文中记录i的值意思就是向栈中写入值。
以上就是令人头疼的自增自减运算符的所有总结了,希望小伙伴们能够批评指正。
本人良弓,初来乍到,请多关照。因为是新人,大家有什么不懂的一定要及时留言,我一定帮你讲明白。也难免有错误的地方,请各位大佬直接纠正,感谢~