
如果你不理解本道题目的结果,那么读完这篇文章,你会发现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()与栈的输入输出的关系。对于其他语言有些的是从左至右的进行压栈的,并不能使用此方法。
最后注:本节有些知识点是为了方便理解属于个人加入!!!若发现有误指出,望指出。
本文深入解析C语言printf函数中的自增运算如何在栈结构中影响输出,通过实例演示了++a和a++的区别,以及临时变量的作用。重点讲解了栈的压入和输出规律以及临时变量tm和tp在不同情况下的行为。
1231

被折叠的 条评论
为什么被折叠?



