下面是用c语言编写的代码
#include<stdio.h>
int foo()
{
static int a=0;
a=a+1;
return a;
}
int main()
{
foo();
foo();
printf("%d",foo());
}我使用gcc11在eclipse 中编译了这段代码,并将3作为输出。
这是我认为应该发生的事情,这导致我的输出为1,而不是3。
函数调用-1:主函数调用函数foo,控制转到函数foo,然后创建foo中的变量'a‘,初始值为零,然后将其递增1,并将这个增量值(1)返回给主函数。在这个步骤中,为foo函数创建的变量应该已经被销毁了。
函数调用-2:与函数调用相同-1:
函数调用-3:与函数调用相同-1:
最后,printf函数在main中打印的值应该是1。
为什么程序的输出是3?
发布于 2014-10-09 09:35:37
用更多的打印试试这个。
#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只初始化了一次,其值在函数调用过程中被保留下来。
见此处:variable
发布于 2014-10-09 09:32:31
当函数返回时,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发布于 2014-10-09 09:39:09
这里,变量a是一个静态变量。
尽管变量的范围必须在函数完全执行之后结束。但是静态变量在整个程序中都有作用域,并且它们不会在整个程序中被删除。
如果是
int a;代替.
static int a;结果会有所不同。
https://stackoverflow.com/questions/26274973
复制相似问题