我遇到了一个小谜题,我试图找到输出。一旦我设法得到输出,我调整了1行,输出完全不同。为什么以下两个程序的输出会有所不同?:
A)
#include<stdio.h>
int fun()
{
static int num = 40;
return num--;
}
int main()
{
for(fun(); fun(); fun())
{
printf("%d ", fun());
}
getchar();
return 0;
}
输出:
38 35 32 29 26 23 20 17 14 11 8 5 2
b)
#include<stdio.h>
int fun()
{
static int num;
num = 40;
return num--;
}
int main()
{
for(fun(); fun(); fun())
{
printf("%d ", fun());
}
getchar();
return 0;
}
输出:每次无限循环打印40
只有一个区别:声明和初始化在(a)中同时完成,但在(b)中分别完成。这对最终结果有何影响?
答案 0 :(得分:3)
static int num = 40;
static int num;
这两个都得到一次评估。 num
不在运行时堆栈上(而是在数据段中)然后,
num = 40;
每次拨打fun()
时都会评估。你将一个在堆栈外声明的变量重新分配给40,导致它永远循环。
答案 1 :(得分:2)
在第一个中,num
仅在第一次调用函数时初始化为40
。在第二个中,每次调用函数时都会将其设置为40
。
答案 2 :(得分:1)
第一个,num被初始化一次,无论你调用函数多少次
第二个,每次调用函数时,num都设置为40
答案 3 :(得分:0)
这里需要考虑两个概念
变量的生命周期是它存在的时间段。如果在没有关键字static的情况下定义num,则生命周期将从fun()到fun()返回;所以每次通话都会重新初始化为40。
变量的范围是可以看到变量名称的位置。这里,num只在函数fun()中可见。
关键字static用于将变量的生命周期延长到程序的生命周期。在静态声明的情况下,初始化只发生一次,然后变量在例程fun()中保留其值。因此,如果您通过在第二种情况下将其设置为值40来覆盖它,则在每次调用fun()时它的值都会设置为40。在第二个代码中,将变量num声明为static是多余的。