先看一段代码,可以自己尝试一下,反正我当时尝试的时候好多搞不懂,
不过现在搞懂了,里面牵扯到了一个入栈和出栈的问题,文章来源地址https://www.toymoban.com/news/detail-696121.html
官方解释是这个:
因为C语言函数参数入栈顺序是从右到左的,所以计算顺序是从右到左开始计算的;对于a++的结果,
是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;
而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作。
大白话解释:
挑选一个举个例子:
printf("%s,%d\n\n", (zp++)->name, (++zp)->age);
从右开始往左扫描,先扫描到(++zp)->age,
对于“++zp”那么计算机会先进行zp的自增操作,然后把zp放到一个寄存器变量中
(直白点就是暂时放到一边,暂时不进行zp->age的指向,等整个printf扫描一遍扫描完了然后再进行zp->age指向)
但是之后的扫描过程中zp的值是寄存器变量中的那个值,也就是zp=zp+1的值,
然后扫描到了(zp++)->name,
对于“zp++”,计算机会先进行把zp->name 所指向的值存在栈空间中,然后再进行zp = zp+1 操作
(直白点就是说zp->name这个值已经定了,不管你printf扫描完还是没扫描完zp怎么变都跟我zp->name没关系了)
#include <stdio.h>
struct Person{
char name[20];
int age;
};
int main()
{
struct Person *zp, p[3] = {
{"wang",12},
{"liu",13},
{"zhang",14}
};
zp = p;
printf("%s,%d\n\n", (zp++)->name, zp->age); //wang 13
zp = p;//初始化
printf("%s,%d\n\n", zp->name, (zp++)->age); //liu 12
zp = p;//初始化
printf("%s,%d\n\n", (zp++)->name, zp->age); //wang 13
zp = p;//初始化
printf("%s,%d\n\n", zp->name, (zp++)->age); //liu 12
zp = p;//初始化
printf("%s,%d\n\n", (zp++)->name, (++zp)->age); //liu 14
return 0;
}
文章来源:https://www.toymoban.com/news/detail-696121.html
到了这里,关于C语言中关于printf()输出的时候的一个出栈入栈问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!