这是用c
编写的代码#include<stdio.h>
int foo()
{
static int a=0;
a=a+1;
return a;
}
int main()
{
foo();
foo();
printf("%d",foo());
}
我在 eclipse IDE 中使用 gcc11 编译了这段代码,我输出了3个。
这就是我认为应该发生的事情,它导致我输出为1而不是3。
函数调用-1: main函数调用函数foo和 控制转到函数foo然后foo中的变量'a' 使用初始值0创建,然后递增 一,此递增值(1)返回主函数。 在此步骤中,为函数foo创建的变量应该已被销毁。
函数调用-2:与函数调用-1相同:
函数调用-3:与函数调用-1相同:
最后,main中printf函数打印的值应为1。
为什么程序的输出是3?
答案 0 :(得分:3)
static
变量不会被销毁。删除该关键字,它将按预期工作。
编辑:
static
变量仅出现在其自身函数的范围内。您可以在其他函数中创建具有相同名称(静态或其他)的其他变量。
void foo()
{
static int a = 0;
a++;
printf("%d\n", a);
}
void bar()
{
int a = 10;
a++;
printf("%d\n", a);
}
void baz()
{
static int a = 100;
a++;
printf("%d\n", a);
}
int main()
{
foo();
bar();
baz();
foo();
bar();
baz();
return 0
}
这将打印:
1
11
101
2
11
102
答案 1 :(得分:3)
尝试更多打印。
#include<stdio.h>
int foo()
{
static int a=0;
a=a+1;
printf("a is now: %d",a);
return a;
}
int main()
{
foo();
foo();
printf("%d",foo());
}
您会注意到变量a只被初始化一次,并且它的值在函数调用调用中保留。
答案 2 :(得分:1)
这里,变量a是静态变量。
虽然变量的范围必须在完成函数执行后结束。但是静态变量在程序中具有范围,并且在整个程序中不会删除它们。
如果是
int a;
代替
static int a;
结果会有所不同。
答案 3 :(得分:1)
请参阅下面的示例,了解静态变量和普通变量之间的区别。
void sample()
{
int nv = 10;//nv refers normal variable.
static int sv = 10;//sv refers static variable.
nv += 5;
sv += 5;
printf("nv = %d, sv = %d\n", nv, sv);
}
int main()
{
int i;
for (i = 0; i < 5; ++i)
sample();
}
<强>输出:强>
nv = 15, sv = 15
nv = 15, sv = 20
nv = 15, sv = 25
nv = 15, sv = 30
nv = 15, sv = 35