静态存储类在c中工作

时间:2015-03-21 09:57:55

标签: c storage

我是初学者,所以请耐心等待我。最近,我开始在C中阅读存储类,我偶然发现了这个问题:

#‎include‬<stdio.h>
int fun()
{
static int num = 16;
return num--;
}
int main()
{
for(fun(); fun(); fun())
printf("%d \n", fun());
return 0;
}

该计划输出:14 11 8 5 2。

1)有什么可以告诉我这段代码是如何工作的?

2)当我保持--num in fun()时,它正在运行一个无限循环。为什么会这样?

3 个答案:

答案 0 :(得分:1)

static int num = 16;表示num将被初始化为16,并且在函数返回时不会被销毁。

return num--;表示将返回num值,但之后num值将减少并保存,因为num被声明为static

我使用数字标记了对fun()的不同调用(只是为了遵循执行流程,而不是用作实际代码),因此可以显示变量num如何变化。

for(fun1(); fun2(); fun4())
    printf("%d \n", fun3());

fun1()&#34;被称为&#34;初始化只有一次。 fun2()是一个控制表达式,如果结果为零,则执行for循环停止。 fun3()&#34;被称为&#34;每次都在循环中。 fun4()&#34;被称为&#34;每次在循环结束时#34;

价值观如何变化:

fun1() called
    num: 16

fun2() called
    num: 15
fun3() called
    num: 14
14
fun4() called
    num: 13

fun2() called
    num: 12
fun3() called
    num: 11
11
fun4() called
    num: 10

fun2() called
    num: 9
fun3() called
    num: 8
8
fun4() called
    num: 7

fun2() called
    num: 6
fun3() called
    num: 5
5
fun4() called
    num: 4

fun2() called
    num: 3
fun3() called
    num: 2
2
fun4() called
    num: 1

fun2() called
    num: 0      ==> stop

如果您将num--更改为--num而不是for循环控制表达式(标记为fun2()),则永远不会为0。

答案 1 :(得分:0)

好吧,首先我希望你知道什么是C中的存储类。现在我们处理静态变量时,这个变量一直存在到程序结束并存储在数据段中。静态变量的一些特征如下:

  

存储=内存

     

默认初始值=零

     

Scope =定义变量的块的本地。

     

Life =变量的值在不同的函数调用之间持续存在。

所以现在回答你的问题。

  1. 代码的工作:为此,我们将从main()开始。在编译器级别思考,首先关注的是for循环。在 for循环中,将执行一次初始化。现在 num = 15 。然后它将检查给定的条件。现在对于C,它只会比较零和非零值。现在为此它返回14并且它不为零,因此它进入循环。现在编译器的魔力开始了。 Read this了解一些信息。所以在你的情况下,wile返回它将首先返回值,然后将值减1.然后将打印第14个,执行循环中的inc / dec块将被执行。然后将再次评估条件。而且,在打印函数时,将首先返回值,然后递减1.在完成所有迭代后,您的输出将在那里。

  2. 当您编写--num时,那么简单的事情是它会先将值减1,然后返回一个值。现在如前所述,编译器仅检查零和非零值。当你正在处理--num然后它进入负值并且它仍然减少它的值,所以它永远不会在零。结果无限循环。您可以修改一些值以检查结果,例如修改 num = 17 - --num,您应该得到相同的结果。

答案 2 :(得分:0)

这个网站上有一篇很好的帖子,它通过静态变量: What does "static" mean?

但基本上静态变量在程序的整个生命周期中保持其值。

我将逐步介绍代码,但将来使用gdb是一个很好的资源: https://www.gnu.org/software/gdb/

int fun()
{
static int num = 16; /* Essentially this line is only seen once by the program.
                     ** The 'num' variable keeps its value for the life of the program. 
                     */ 
return num--; /* Returns the value of 'num' and *afterwards* subtracts 1 from 'num'. */
}
int main()
{
for(fun(); fun(); fun())
printf("%d \n", fun()); /* This line runs the for loop  until 'num' == -1, as the 
                        ** condition is fun(), which is true while it returns a 
                        ** value > 0. fun() is run twice when the loop starts, once in 
                        ** the intialising part of for() (the first term), then once by 
                        ** the conditional term (the middle term). From there on it is 
                        ** run once by the printf(), once by the updating term 
                        ** (the end term), and once by the conditional term, 
                        ** until the conditional term is not fulfilled. 
                        */
return 0;
}

至于为什么当return --num;是fun()中的最后一行时它不会运行,这是因为for循环中的条件语句永远不会收到0(0且只有0为false) ,其他每个数字都是真的)。该方案的产出将是:13,10,7,4,1,-2等;意味着条件语句将收到:14,18,8,5,2,-1等。