2014-10-09 2 views
0

Вот код, написанный на CЖизнь переменная, определенная в функции, кроме основной

#include<stdio.h> 

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

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

Я составил этот код, используя gcc11 в Eclipse IDE и у меня есть 3, как мой вывод.

Вот что я думаю, что должно произойти, что приводит меня к выходу, как 1 не 3.

Вызов функции-1: Основная функция вызывает функцию Foo и управление переходит к функции Foo, то переменная 'a' в foo - , созданная с начальным значением нуля, то она увеличивается на , и это добавочное значение (1) возвращается к основной функции. На этом этапе переменные, созданные для функции foo, должны быть уничтожены.

Вызов функции-2: То же, что Вызов функции-1:

Вызов функции-3: То же, что Вызов функции-1:

В конце концов значение напечатанные функцией printf в главном, должны быть 1.

Почему выход программы составляет 3?

ответ

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()); 
} 

Вы заметите, что переменная а инициализируется только один раз, и его значение сохраняется между вызовами функции обработки вызовов.

Смотрите здесь: http://en.wikipedia.org/wiki/Static_variable

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 
+0

Это очень помогает. Спасибо! –

1

Здесь переменная а является статической переменной.
Хотя область действия переменной должна быть завершена после полного выполнения функции. Но переменная Static имеет Scope через программу, и они не удаляются во всей программе.

, если он был

int a; 

в месте

static int a; 

Результат был бы другим.

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 
Смежные вопросы