c语言printf问题(a++,++a,--a,a--)

c语言printf函数处理输出值参数如何处理

举例:

#include<stdio.h>
int main()
{
	int i = 0;
    printf("%d,%d,%d\n", --i, --i, i++);
}

有人会认为打印结果为:0,0,-1
但实际打印结果为:
在这里插入图片描述
相信大家都知道,printf()这个函数在打印参数内容时,入栈是从右往左的,当有多个参数时,先遍历一遍参数然后在依次打印。

那么,上述例子入栈顺序也就是i++、i–、i–。(入栈同时计算,出栈直接输出并不计算。栈先进后出)
栈:栈相当于一个水瓶子,往里面放东西,最先进去的在栈底,所有只有等上面的所有的都出去了,栈底的东西才能出来,即先进后出。

那么,上述例子,i=0,i++先运算后加,输出结果是0但i变成1了,后面–i先减后运算,不是应该是0??
到底为什么?

解释

(1)处理表达式i++
当处理表达式i++时,cpu中寄存器将最初i=0放入一个临时整型大小的地址(相当于副本,副本为0),寄存器将i+1存储到原来i的内存中(真值为1)。
(2)处理表达式–i,寄存器将i-1存储到原来i的内存中(此时的i为1,真值为0,无副本)。
(3)处理表达式–i,寄存器将i-1存储到原来i的内存中(此时的i为0,真值为-1,无副本)。
(4)最后,通过寄存器将临时地址的值(副本)入栈(i++),通过寄存器将内存中i的入栈(最后内存那个真值i,-1,并非此刻那个i,0,处理中间–i),通过寄存器将内存中i的入栈。

表达式真值副本
栈顶- -i-1
- -i0
栈底i++10

结论

对于前置++、–(即++a、–a),它只进行真值加一的操作(不进行将自己拷贝一次)。
对于后置++、–(即a++、a–),它先将自己拷贝存储(副本),然后真值加一。
最后,前置输出最后那个真值,后置输出副本的值。

  • 11
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值