静态存储 class 在 c 中工作
static storage class working in c
我是初学者,请多多包涵。最近,我开始阅读 storage 类 in 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) 当我在 fun() 中保留 --num 时,它是 运行 一个无限循环。为什么会这样?
嗯,首先我希望你知道 C 中的 存储 Class 是什么。现在当我们处理静态变量时,这个变量一直存在到程序结束并存入数据 segment.Some 静态变量的特点如下:
Storage = memory
Default initial value = Zero
Scope = Local to the block in which the variable is defined.
Life = Value of the variable persists between different function call.
现在开始回答你的问题。
code:Well 的工作我们将从 main() 开始。在编译器级别思考,首先关注的是 for 循环。在for循环中,会进行一次初始化。现在 num = 15。然后它将检查给定的条件。现在对于 C,它只会比较 零值和非零值 。现在为此它 returns 14 并且它是非零的所以它进入循环。现在编译器的魔力开始了。 Read this 了解一些信息。所以在你的情况下 returning 它将首先 return 值然后递减值 1.so 前 14 将被打印,inc/dec for 循环中的块将得到 executed.Then 条件将再次被评估。再次,在打印函数时,将先 return 值然后减 1。在所有迭代之后,您的输出将在那里。
当你写 --num 时,简单的事情是它会先将值减 1,然后 return 一个值。现在如前所述,编译器仅检查零值和非零值。当您处理 --num 时,它会变成负值并且它的值仍然会递减,因此它永远不会在零处相遇。因此导致无限循环。您可以修改一些值来检查您的结果,例如将 num=17 修改为 --num,您应该会得到相同的结果。
static int num = 16;
表示num
会被初始化为16,在函数returns.
时不会被销毁
return num--;
意味着 num
值将被返回,但之后 num
值将被减少并保存,因为 num
被声明为 static
。
我用数字标记了对 fun()
的不同调用(只是为了遵循执行流程,而不是用作真实代码),因此可以显示变量 num
是如何变化的。
for(fun1(); fun2(); fun4())
printf("%d \n", fun3());
fun1()
"is called" 只初始化一次。 fun2()
是一个控制表达式,如果结果为零则 for
循环停止执行。 fun3()
"is called" 每次循环。 fun4()
"is called" 每次在循环结束时
价值观如何变化:
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。
此站点上有一个很好的 post 可以遍历静态变量:
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 是假的,其他每个数字都是真的)。该程序的输出将是:13、10、7、4、1、-2 等;这意味着条件语句将收到:14、11、8、5、2、-1 等
我是初学者,请多多包涵。最近,我开始阅读 storage 类 in 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) 当我在 fun() 中保留 --num 时,它是 运行 一个无限循环。为什么会这样?
嗯,首先我希望你知道 C 中的 存储 Class 是什么。现在当我们处理静态变量时,这个变量一直存在到程序结束并存入数据 segment.Some 静态变量的特点如下:
Storage = memory
Default initial value = Zero
Scope = Local to the block in which the variable is defined.
Life = Value of the variable persists between different function call.
现在开始回答你的问题。
code:Well 的工作我们将从 main() 开始。在编译器级别思考,首先关注的是 for 循环。在for循环中,会进行一次初始化。现在 num = 15。然后它将检查给定的条件。现在对于 C,它只会比较 零值和非零值 。现在为此它 returns 14 并且它是非零的所以它进入循环。现在编译器的魔力开始了。 Read this 了解一些信息。所以在你的情况下 returning 它将首先 return 值然后递减值 1.so 前 14 将被打印,inc/dec for 循环中的块将得到 executed.Then 条件将再次被评估。再次,在打印函数时,将先 return 值然后减 1。在所有迭代之后,您的输出将在那里。
当你写 --num 时,简单的事情是它会先将值减 1,然后 return 一个值。现在如前所述,编译器仅检查零值和非零值。当您处理 --num 时,它会变成负值并且它的值仍然会递减,因此它永远不会在零处相遇。因此导致无限循环。您可以修改一些值来检查您的结果,例如将 num=17 修改为 --num,您应该会得到相同的结果。
static int num = 16;
表示num
会被初始化为16,在函数returns.
return num--;
意味着 num
值将被返回,但之后 num
值将被减少并保存,因为 num
被声明为 static
。
我用数字标记了对 fun()
的不同调用(只是为了遵循执行流程,而不是用作真实代码),因此可以显示变量 num
是如何变化的。
for(fun1(); fun2(); fun4())
printf("%d \n", fun3());
fun1()
"is called" 只初始化一次。 fun2()
是一个控制表达式,如果结果为零则 for
循环停止执行。 fun3()
"is called" 每次循环。 fun4()
"is called" 每次在循环结束时
价值观如何变化:
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。
此站点上有一个很好的 post 可以遍历静态变量: 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 是假的,其他每个数字都是真的)。该程序的输出将是:13、10、7、4、1、-2 等;这意味着条件语句将收到:14、11、8、5、2、-1 等