首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在main以外的函数中定义的变量的寿命

在main以外的函数中定义的变量的寿命
EN

Stack Overflow用户
提问于 2014-10-09 09:30:55
回答 4查看 135关注 0票数 0

下面是用c语言编写的代码

代码语言:javascript
复制
#include<stdio.h>

int foo()
{
    static int a=0;
    a=a+1;
    return a;
}

int main()
{
    foo();
    foo();
    printf("%d",foo());
}

我使用gcc11eclipse 中编译了这段代码,并将3作为输出。

这是我认为应该发生的事情,这导致我的输出为1,而不是3。

函数调用-1:主函数调用函数foo,控制转到函数foo,然后创建foo中的变量'a‘,初始值为零,然后将其递增1,并将这个增量值(1)返回给主函数。在这个步骤中,为foo函数创建的变量应该已经被销毁了。

函数调用-2:函数调用相同-1:

函数调用-3:函数调用相同-1:

最后,printf函数在main中打印的值应该是1。

为什么程序的输出是3?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-09 09:35:37

用更多的打印试试这个。

代码语言:javascript
复制
#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

票数 3
EN

Stack Overflow用户

发布于 2014-10-09 09:32:31

当函数返回时,static变量不会被销毁。删除该关键字,它将如您所期望的那样工作。

编辑:static变量只存在于它自己函数的作用域中。您可以在其他函数中创建同名(静态或其他)的其他变量。

代码语言:javascript
复制
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
}

这将打印:

代码语言:javascript
复制
1
11
101
2
11
102
票数 3
EN

Stack Overflow用户

发布于 2014-10-09 09:39:09

这里,变量a是一个静态变量。

尽管变量的范围必须在函数完全执行之后结束。但是静态变量在整个程序中都有作用域,并且它们不会在整个程序中被删除。

如果是

代码语言:javascript
复制
int a;

代替.

代码语言:javascript
复制
static int a;

结果会有所不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26274973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档