栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

如果你不理解本道题目的结果,那么读完这篇文章,你会发现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()与栈的输入输出的关系。对于其他语言有些的是从左至右的进行压栈的,并不能使用此方法。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873274.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号