2016-04-06 3 views
0

Допустим, у меня есть функция void func(), и я использую переменную testVar внутри этой функции. Кроме того, мне нужно, чтобы переменная сохранялась после выхода из функции. Обычно я делал это, используя статическую переменную внутри функции (1). Но каковы различия, когда вместо этого я буду использовать глобальную переменную (2)?Разница между статической глобальной переменной и статической переменной внутри fucntion

static int testVar = 0; //global variable instead(2) 

void func() 
{ 
    static int testVar = 0; //static variable inside of the function(1) 

    if(testVar++){ 
     //do something 
    } 
} 

Что делает компилятор в обоих случаях в деталях? Есть ли сценарий, где я должен использовать метод (2), если переменная нужна только в func()?

+2

Возможный дубликат [Что означает «статический» в программе C?] (Http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program) – ameyCU

+0

@ameyCU Это а не о чем этот вопрос. – Lundin

+0

@ Lundin Думаю, ответ на этот вопрос ответ им. – ameyCU

ответ

1

здесь некоторые скорректированный код, чтобы показать различия между , где определены переменные: (от: What does "static" mean?)

#include <stdio.h> 

//static int sa = 10; 

void func1() 
{ 
    int a = 10; 
    static int sa = 10; 

    a += 5; 
    sa += 5; 

    printf("func 1: a = %d, sa = %d\n", a, sa); 
} 

void func2() 
{ 
    int a = 10; 
    static int sa = 10; 

    a += 5; 
    sa += 5; 

    printf(" func2 : a = %d, sa = %d\n", a, sa); 
} 


int main() 
{ 
    int i,j; 

    for (i = 0; i < 10; ++i){ 
     func1(); 
    } 

    for (j = 0; j < 10; j++) 
    { 
     func2(); 
    } 
} 

производит:

func 1: a = 15, sa = 15 
func 1: a = 15, sa = 20 
func 1: a = 15, sa = 25 
func 1: a = 15, sa = 30 
func 1: a = 15, sa = 35 
func 1: a = 15, sa = 40 
func 1: a = 15, sa = 45 
func 1: a = 15, sa = 50 
func 1: a = 15, sa = 55 
func 1: a = 15, sa = 60 
func2 : a = 15, sa = 15 
func2 : a = 15, sa = 20 
func2 : a = 15, sa = 25 
func2 : a = 15, sa = 30 
func2 : a = 15, sa = 35 
func2 : a = 15, sa = 40 
func2 : a = 15, sa = 45 
func2 : a = 15, sa = 50 
func2 : a = 15, sa = 55 
func2 : a = 15, sa = 60 

в то время как

#include <stdio.h> 

static int sa = 10; 

void func1() 
{ 
    int a = 10; 
// static int sa = 10; 

    a += 5; 
    sa += 5; 

    printf("func 1: a = %d, sa = %d\n", a, sa); 
} 

void func2() 
{ 
    int a = 10; 
    //static int sa = 10; 

    a += 5; 
    sa += 5; 

    printf(" func2 : a = %d, sa = %d\n", a, sa); 
} 

производит

func 1: a = 15, sa = 15 
func 1: a = 15, sa = 20 
func 1: a = 15, sa = 25 
func 1: a = 15, sa = 30 
func 1: a = 15, sa = 35 
func 1: a = 15, sa = 40 
func 1: a = 15, sa = 45 
func 1: a = 15, sa = 50 
func 1: a = 15, sa = 55 
func 1: a = 15, sa = 60 
func2 : a = 15, sa = 65 
func2 : a = 15, sa = 70 
func2 : a = 15, sa = 75 
func2 : a = 15, sa = 80 
func2 : a = 15, sa = 85 
func2 : a = 15, sa = 90 
func2 : a = 15, sa = 95 
func2 : a = 15, sa = 100 
func2 : a = 15, sa = 105 
func2 : a = 15, sa = 110 

краткие комментарии (из исходной ссылке): What does "static" mean?

  • Статические определенные локальные переменные не теряют значения между FUNC . Другими словами, они являются глобальными переменными, но область действия к локальной функции они определены в.

  • Статические глобальные переменные не видны за пределами файла C они
    определены в.

  • Статические функции не видны за пределами файла C они являются
    определены в.

+0

Правильное определение глобальной переменной - это переменная, глобально видимая для всей программы. Таким образом, переменная 'static' никогда не может быть глобальной. Не смешивайте «глобальные» с «файловой сферой», это разные термины. – Lundin

+0

Спасибо за обновление, но это не то, о чем я прошу. Вопрос был для сценария, когда я использую var в одной функции. – xy36

4

Единственное отличие состоит в том, что, когда переменная объявлена ​​внутри функции, она имеет локальную область только к эта функция. Чтобы максимально уменьшить область действия переменной, это всегда хорошая практика, поэтому, если это возможно, вы должны это сделать.

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

В некоторых случаях размещение переменных в области файлов является плохой практикой программирования, поскольку это делает код более трудным для чтения и обслуживания. Это та же проблема, что и глобальные переменные считаются плохими, хотя переменная области статического файла не является глобальной (она не видна всей программе).

В других случаях, особенно встраиваемых системах, где имеется только один экземпляр «класса», который вы пишете (singleton), то использование области содержимого статические переменные являются обычной практикой, так как способ бедных людей делать частную инкапсуляцию ,

Смежные вопросы