浅析那些初学者头疼i++,i--,-i--等自增自减运算符

浅析那些初学者头疼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–ii++i–-i++-i–
左值直接向前传递递增之后的数值8,但是仍旧记录i的地址,已到栈顶开始出栈左值直接向前传递递减之后的数值7,但是仍旧记录i的地址记录数值7,向前传递数值8.记录数值8,向前传递数值7.记录数值-7,向前传递8.此处初始i的值为8,记录-i的值-8,向前传递i++后的值7。
ii78-7-8

最终i的值为8,依次出栈。所以从前到后依次输出:8,8,7,8,-7,-8.

注意:上文中记录i的值意思就是向栈中写入值。

以上就是令人头疼的自增自减运算符的所有总结了,希望小伙伴们能够批评指正。

本人良弓,初来乍到,请多关照。因为是新人,大家有什么不懂的一定要及时留言,我一定帮你讲明白。也难免有错误的地方,请各位大佬直接纠正,感谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值