【保姆级教学】关于C语言中printf的压栈和i++与++i问题

本文详细解释了C语言中i++和++i的区别,以及printf函数参数压栈的顺序对输出的影响。通过实例分析了i++和++i在表达式中的运算顺序和值的变化,并探讨了printf从右向左压栈的规则。最后,通过一个复杂的printf语句展示了其执行过程,帮助读者深入理解这些概念。
摘要由CSDN通过智能技术生成

当printf遇上了i++和++i 当我看到这个代码的时候,突然就对printf和i++产生了疑问。

i=1;	printf("%d %d\n",i,i++)                  // 2 1
i=1;    printf("%d %d\n",i++,i);                 // 1 2
i=1;    printf("%d %d %d\n",i,i++,i);            // 2 1 2
i=1;    printf("%d %d %d %d %d\n",i,++i,i++,i);  // 3 3 1 3

输出的结果是不是有点意外!!! 我查阅了很多资料终于弄明白了。。。

先说下i++和++i的区别

  • i++ 会先复制一个副本,然后在真值上 (真值就是原来的数据) +1,相当于产生了两个变量,一个是副本不会变,一个原来的数据会+1。

  • ++i 则是直接在原数据上+1,不会产生新的中间变量。

然后说下printf的压栈问题

  • 用一个例子讲解一下,先自己思考一下最后会输出多少会能更好的理解,输出结果最后解密,最后的结果可能超出你的预料哟!!!int a = 1; printf("%d %d %d %d %d %d %d\n", a++,++a,a++,++a,a,a++,++a);

  • printf是先从右向左压栈,压栈的时候瞬间算出结果,然后按这个例子结尾的++a属于高位,开头的a++属于低位,出栈的时候从低位开始出。

入栈顺序

入栈参数

操作

栈内情况

a的值

⑦(低位)

a++

先copy一个a,然后对原数据a+1,将copy的压栈

a(copy3)
a
a(copy2)
a
a
a(copy1)
a

7

++a

直接对a+1

a
a(copy2)
a
a
a(copy1)
a

6

a++

先copy一个a,然后对原数据a+1,将copy的压栈

a(copy2)
a
a
a(copy1)
a

5

++a

直接对a+1

a
a
a(copy1)
a

4

a

直接就是a

a
a(copy1)
a

3

a++

先copy一个a,然后对原数据a+1,将copy的压栈

a(copy1)
a

3

①(高位)

++a

直接对a+1

a

2

注意: 1,当有副本的时候会输出副本,但是真值已经加了1了。 2,对真值操作就相当于对原来的a操作,所以每次更改真值,会把栈底的a也会改变。

 正确答案就是 6 7 4 7 7 2 7.

总结

  • printf是从右向左读取参数压栈,在压栈的时候会算出来值。

  • 改变真值时候是会影响下面的a,其实就是改变原来的数据。

  • 可能老师教i++和++i的时候,是说i++先判断,++i是先加,这让更通俗,但是会把人带坏,记住他们的本质。

【C语言】五小时快速入门C语言icon-default.png?t=M85Bhttps://nxv.xet.tech/s/3wB3iM

【C语言】零基础到项目实战(交换机项目)icon-default.png?t=M85Bhttps://nxv.xet.tech/s/2bnZ5w【C++】实战入门:智能婚恋交友系统icon-default.png?t=M85Bhttps://nxv.xet.tech/s/1gtfps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言小火车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值