2017-01-28 2 views
-8

У меня есть программа c. Но я не могу понять выход этой программы.как статическая переменная работает в c

int main(){ 
    int i=2; 
    for(i=0;i<=3;i++){ 
     static int i; 
     i=i+8; 
    } 

    printf("%d",i); 
} 

Я считаю, что вывод должен быть 8, но фактический выход 4.

Может кто-нибудь объяснить, почему?

+1

В каком состоянии сломал свой цикл? – WhozCraig

+0

То, что внутренняя переменная 'i' является' static', здесь не имеет отношения. Это переменная 'i' во внешней области, которую вы печатаете (и используется для переменной цикла). –

+0

Попробуйте использовать разные имена переменных –

ответ

5

int i = 2; определяет переменную с именем i внутри функции main. static int i; определяет переменную с именем i, то есть внутри цикл for; после окончания цикла эта переменная больше не видна. Таким образом, в строке printf("%d", i); имя i относится к i, который был определен в начале функции, а не той, которая определена внутри цикла.

Внутри корпуса петли линия i=i+8; относится к i, которая определена внутри тела контура. Поэтому, если строка printf появилась до }, которая заканчивает цикл, она отображает значение этой переменной. Однако это значение не будет равно 8; попробуйте и посмотрите.

4

Потому что ваша функция printf печатает локальную переменную i значение. static int i Объем только внутри цикла for.

Когда локальная переменная i станет 4 < = 3, то условие ложь и печать i значение 4.

Внутренне компилятор работа в протекающем потоке:

local i   condition  static i    operation 

i = 0   0 <= 3(true)  i = 0   i = 0(static) + 8 

i = 1   1 <= 3(true)  i = 8   i = 8(static) + 8 

i = 2   2 <= 3(true)  i = 16   i = 16(static) + 8 

i = 3   3 <= 3(true)  i = 24   i = 24(static) + 8 

i = 4   4 <= 3(false) 

Затем распечатайте i = 4.

3

С i внутри for петля теней другая i, давайте перепишем с использованием имен differnet для наглядности.

int main(){ 
    // int i=2; 
    int outside_i=2; 
    // for(i=0;i<=3;i++){ 
    for(outside_i=0;outside_i<=3;outside_i++){ 
     // static int i; 
     static int inside_i; 
     // i=i+8; 
     inside_i=inside_i+8; 
    } 
    // printf("%d",i); 
    printf("%d",outside_i); 
} 

Это упрощает для

int main(){ 
    int outside_i=2; 
    for(outside_i=0;outside_i<=3;outside_i++){ 
     ; // do stuff that does not affect outside_i 
    } 
    printf("%d",outside_i); 
} 

И далее к

int main(){ 
    int outside_i; 
    outside_i=0; 
    outside_i++; 
    outside_i++; 
    outside_i++; 
    outside_i++; 
    printf("%d",outside_i); 
} 
Смежные вопросы