静态存储类在c中工作

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

#‎include‬ 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()时,它正在运行一个无限循环。 为什么会这样?

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

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

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

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

fun1()只在初始化时被“调用”一次。 fun2()是一个控制表达式,如果结果为零,则执行for循环停止。 每次循环时都会调用fun3() “。 fun4() “每次在循环结束时被调用”

价值观如何变化:

 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不是循环控制表达式(标记为fun2() ),则永远不会为0。

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

存储=内存

默认初始值=零

范围=定义变量的块的本地。

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

所以现在回答你的问题。

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

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

在这个网站上有一个很好的post,它通过静态变量: “静态”是什么意思?

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

我将逐步介绍代码,但是将来使用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;时不运行return --num; 这是fun()中的最后一行,这是因为for循环中的条件语句永远不会收到0(0且只有0是false,其他每个都是true)。 该方案的产出将是:13,10,7,4,1,-2等; 意味着条件语句将收到:14,18,8,5,2,-1等。