c语言的问题谁知道原理

如题所述

这个问题比较复杂,涉及到OB操作,因此在不同的编译器上结果可能会不一样。编译器具体的处理步骤可以通过反汇编查看。初学者不建议研究这个问题,因为既难以理解又没有意义。
我以你用的VS为例简单说一下这个语句在VS上的处理过程。
首先有两个基本知识必须了解:1.函数参数压栈顺序是从右向左的;2.变量后的++号代表该行语句结束后变量再自加,变量前的++号代表先自加变量,然后执行该行语句。
接下来有一个非常重要的内容:VS处理函数参数时,如果编译器遇到i++,则将i当前值立即压栈;如果编译器遇到++i,则将i先自加1,然后将i的引用压栈;如果编译器遇到i,将i的引用压栈。当所有参数处理完毕后,再将栈中所有的引用替换为i的当前值。这一点直接决定了输出结果。
对于这样一个函数printf("%d %d %d %d %d",++i+(++i),i++,++i+(++i+100),++i,i++);,假设堆栈内的5个函数参数用数组s[5]表示,编译器的处理步骤是:
1.最后一个参数为i++,因此将i的当前值2立即压栈,得s[4]=2。然后将i自加1,得i=3;
2.倒数第二个参数为++i,先将i自加1变为4,然后将i的引用&i压栈,得s[3]=&i;
3.第三个参数为++i+(++i+100),由于括号优先级最高,先处理括号内的++i,将i自加1变为5,然后取i的引用和100相加,即&i+100;最后再处理括号外的++i,先将i加1变为6,然后将i的引用&i和&i+100相加,得&i+(&i+100)。将这个结果压栈,得s[2]=&i+(&i+100);
4.第二个参数为i++,将i的当前值6立即压栈,得s[1]=6,然后将i自加1,得i=7;
5.第一个参数为++i+(++i),处理方式同第三个参数,先处理后面的++i,将i自加1变为8,然后取引用&i;接着处理前面的++i,将i自加1变为9,然后取引用&i和后面的&i相加,得&i+&i。将这个结果压栈,得s[0]=&i+&i。
所有参数压栈完毕后,开始处理所有栈内的引用&i,将它们替换为i的当前值9。
s[0]=&i+&i=9+9=18
s[1]=6
s[2]=&i+(&i+100)=9+(9+100)=118
s[3]=&i=9
s[4]=2
最后将前面的字符串表达式"%d %d %d %d %d"压栈,然后call printf函数,输出栈s的5个元素,即18、6、118、9、2。追问

很好虽然已今懂了还是多射你

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-01-16
你要知道什么原理追问

自已看图吖

追答

就是怎么显示成这样的?

追问

追答

那个printf是一个函数,c语言有很多这样的函数,这里是输出函数,

输什么就显示输出什么

后面的数字,就是输入的i,然后再自增

相似回答