公司网站建设管理制度,西安seo专员,网站设计的要求有哪些,线上购物网站建设成本先看一段代码#xff0c;可以自己尝试一下#xff0c;反正我当时尝试的时候好多搞不懂#xff0c; 不过现在搞懂了#xff0c;里面牵扯到了一个入栈和出栈的问题#xff0c; 官方解释是这个#xff1a; 因为C语言函数参数入栈顺序是从右到左的#xff0c;所以计算顺序是…先看一段代码可以自己尝试一下反正我当时尝试的时候好多搞不懂 不过现在搞懂了里面牵扯到了一个入栈和出栈的问题 官方解释是这个 因为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的值是寄存器变量中的那个值也就是zpzp1的值然后扫描到了(zp)-name,
对于“zp”计算机会先进行把zp-name 所指向的值存在栈空间中然后再进行zp zp1 操作
直白点就是说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 13zp p;//初始化printf(%s,%d\n\n, zp-name, (zp)-age); //liu 12zp p;//初始化printf(%s,%d\n\n, (zp)-name, zp-age); //wang 13zp p;//初始化printf(%s,%d\n\n, zp-name, (zp)-age); //liu 12zp p;//初始化printf(%s,%d\n\n, (zp)-name, (zp)-age); //liu 14return 0;
}