static和=哪个优先级高?
c语言吧
全部回复
仅看楼主
level 1
int fac(int n){static int f=1;f=f*n;return f;}main(){int i;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));getch();}这里f改变值之后又有个f=1语句啊
2006年08月30日 13点08分 1
level 1
你每次调用fac都会执行static int f=1;虽然static声明的局部变量在调用完函数后仍保留原值,但不代表不可改变!
2006年08月30日 15点08分 2
level 0
手机上网能发表新主题吗?手机上网的费用是多少啊?按条收费还是按月收费?
2006年08月30日 15点08分 3
level 1
其实这个问题不存在优先级的问题,static int 为一整体定义 f
2006年08月30日 15点08分 4
level 0
你每次调函数都会执行static int f=1;这句啦!虽然static定义的局部变量在函数调用结束后保留原值,但不代表不可变!
2006年08月30日 15点08分 5
level 1
呵呵,我想这里应该困惑了一些人吧,是有些饶人啊。那,要分析这个,就不能不涉及到程序编译分配的一些知识了。这里我简单的说一下吧。程序编译分配有几个地方:静态区,局部变量区,程序代码区和自由空间。比如fac这个函数,编译后呢,代码自然是程序代码区了,n放局部变量区,如果有堆结构的话就是自由空间,还有一类就是这个加了static的,不管其放哪,或是全局的或是局部的,只在编译时初始化一次,即static int f=1只在编译时编译并初始化为1,放在静态区,以后调用多少次都不重新执行再赋值1,再说一便,只编译初始化一次,在不重复执行了。由于它保持变量内容,所以以后就直接执行后面的语句对其进行操作,这样就不是一般所想的每次都赋值为1。ok了?
2006年08月31日 12点08分 7
level 1
…………………………静态跟赋值,两者不是一个事儿嘛~~~~~~~~~~~~~= =
2006年08月31日 13点08分 8
level 7
每次调用函数都会将static int f赋值为1
2006年08月31日 13点08分 9
level 0
哦,明白了,初始化就一次,和赋值不是一回事啊
2006年09月01日 06点09分 10
level 1
7楼大哥``能不能在说的更加透彻点啊``被你说有点迷糊``
2006年09月02日 09点09分 11
level 1
首先,要说的是,对不起11楼及所有被我整晕的弟兄们了。上次说的绕的确是不得以。因为这个涉及的面还是比较深的。如果是泛泛的说,可能又不够清晰。接下来,我就透彻一些的说吧。要想搞清楚来龙去脉,不得不提到一些C语言编译方面的工作。这里,很多编程者是不涉及的。大家在录入程序的时候,后缀名位.c之类的文件都是ASCII文本文件,不是运行的程序。只有当编译链接之后生成的.exe文件才是。就是说,编译是在大家运行程序之前就做的事情。那么,从.c到.exe之间就有了一些变化。变化在哪呢?就是录入的这些东西编译的存储策略各有其位。如上所说的,针对代码,编译后的东西放到程序代码区,而局部于各函数的局部动态变量放到局部变量区,当然,它的生命域和作用域只局限于所包容的那个函数,而如果你的程序涉及到堆这种数据结构时,放到的是自由空间那个地方。而上面考虑的加了static修饰的变量,不论是全局的还是局部于某程序的,在编译的时候放到的是静态存储区,所以f和n不在一个地方,虽然作用域都是fac函数,但由于是static类型的,那么它的生命域就是整个程序期间一直存在,而n在每次调用fac时重新生成再次初始化。这就是生命域与作用域之间的异同!好了,现在清楚的明白一点,每次调用n都是要重新来的,但f由于在应用程序运行期间一直存在,则调用f时.exe文件中并没有关于‘=1’这种重复性的语句。所以每次调用都是在f的当前值上接着施加影响。最后,要说的是,理解这个对一般的c语言初学者来说并不是一件易事。这里面涉及到比较深的编译及系统结构知识,即便是会写c语言的也可能是知其然不知其所以然。可以先跳过一些深层次的东西,从会编写开始树立信心!从中体验快乐,套用一句‘快乐编程’。祝你好运!
2006年09月02日 13点09分 12
1