关于printf()与栈的输入输出的关系

本文深入解析C语言printf函数中的自增运算如何在栈结构中影响输出,通过实例演示了++a和a++的区别,以及临时变量的作用。重点讲解了栈的压入和输出规律以及临时变量tm和tp在不同情况下的行为。

如果你不理解本道题目的结果,那么读完这篇文章,你会发现printf()的输出其实另有蹊跷。

关于C语言中printf的输出与栈有关。在C语言中,栈的压入是按从右到左的顺序进行的。

如一组数,printf("%d,%d,%d,%d",a,b,c,d);  它压入栈中就是

    d                栈顶

    c

    b

    a                   栈底

其存入是从右至左存入,其输出是从下至上进行的。在压入栈中,会进行完所有运算然后再进行输出。(这一点在a++,++a时可以明显的看出)

比如

这些输入压栈之后是

        d                -栈顶        

        c

        b

        a                  -栈底

输出的结果是:

说明了栈的输出是从下往上进行的!

这一点相信大家都懂,接下来开始本篇文章的重点了。

对于printf()中含有自增的运算

此程序的结果是:

压入栈中的数据为

++a                -栈顶

a++

a                     -栈底

 在栈中的运算从上往下进行。按此进行运算

第一步:++a,先将a+1后赋值给a,此时a为2,那么第一不的数据就是2。

第二步:进行a++,先使用a,a为2,将a+1赋给a,得a为3,第二步中的数据就应该是 2。

第三步:最后a=3。第三步中的数据为 3 

然后根据从下往上进行输出的结果是

3,2,2

与运行的结果不同,这是因为在栈中a++的运算以及++a的运算不如往常。

只要++a出现在表达式中,最终结果的++a都与a的值相同!临时变量,而实际的a去完成自增运算。因为在运算中,编译器会构造一个临时变量来储存++a中的a。

我们这里用tm 来表示这个临时变量。++a在栈中实际就是:tm = a | ++a。但是这个tm = a,这个tm的值会随a的值的改变而改变。比如:这个程序

 将数据存放入栈时

   tm = a | ++a     

  tm = a  | ++a

   a

  tm = a |  ++a 

在第一步时tm = a,先进行了++a,a的值变为2,此时tm = 2。

然后在存入第二个时,先进行++a,a的值变为3,tm = 3。

第三步没有操作。

第四步,依旧是先进行++a,a的值变为了4,然后tm = 4。

此时我们可以由最后一步得知,a = 4,tm = 4。因此我们由下往上进行输出,就是:

4,4,4,4。我们看一下代码的运行结果

因此我们可以知道其实++a中的临时变量tm是会改变的,而不是不变的。

而对于a++出现在表达式中的时候,也会有一个临时变量来存储它的值,只不过这个临时变量只是相当于一个中间变量,不会在因为后面的运算而改变,知道要输出栈的时候,再把这个中间变量输出。我们这里用tp来表示这个临时变量,a++在栈中就可以表示为:tp = a | a++。

下面我们看一下下面一串代码

 首先我们先将数据存入栈中:

      tp1 = a | a++

       a 

       tp2 = a | a++

        a

第一步运算为:先将a赋给tp1,则tp1 = 1,再进行a++,得a = 2。

第二 步:\

第三步运算为:先将a的值赋给tp2,则tp2 = 2,然后进行a++,得a的值为3。

因此此时我们知道,a = 3,tp1 = 1,tp2 = 2。

根据从下往上进行输出得到结果:3,2,3,1

看到这里,我相信各位都应该能够理解第一个代码的输出结果了吧。

接下来,我们在进行几个题目的详细解答。

首先还是将他们存放在栈中的情况写出:

tp1 = a | a++

tm = a | ++a

a

tp2 = a | a++

tm = a | ++a

a

 对于第一步:先将a = 1的值给tp1,得tp1 = 1,然后a++,得a = 2。

第二步:先进行++a,得 a = 3,然后再将a赋给tm,得tm = 3

第三步:\

第四步:先将a = 3的值赋给tp2,则tp2 = 3,然后a++,得a = 4。

第五步:先进行++a,得 a = 5,然后再将a赋给tm,得tm = 5。

第六步:\

此时我们知道 a = 5,tm = 5, tp1 = 1,tp2 = 3。由下至上输出可得:

5,5,3,5,5,1

以上就是关于C语言中printf()与栈的输入输出的关系。对于其他语言有些的是从左至右的进行压栈的,并不能使用此方法。

最后注:本节有些知识点是为了方便理解属于个人加入!!!若发现有误指出,望指出。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值