2015-07-28 2 views
-2

Почему я получаю 20 в выходе, поскольку автоматические переменные имеют размер блока?Почему я получаю 20 на выходе?

#include <stdio.h> 

int main(void) { 
    int a=0; 
    { 
     int a=10; 
     printf("%d",a); 
     a++; 
     { 
      a=20; 
     } 
     { 
      printf(" %d",a); 
      int a=30; {a++;} 
      printf(" %d",a++); 
     } 
     printf(" %d",a++); 
    } 
    printf(" %d",a); 
    return 0; 
} 

Выход:

10 20 31 20 0 
+1

Переменные * объявлены * в блоке имеют область блока; * присваивание * переменной является постоянным, хотя - это не значит, что назначения откат назад, когда вы выходите из этого блока. Если вы замените 'a = 20;' во внутреннем блоке на 'int a = 20;' вы получите ожидаемый результат. –

+0

Прочтите это. Вы поймете, почему [http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Scope](http://www.gnu.org/software/gnu-c-manual /gnu-c-manual.html#Scope) –

+0

Ваш вопрос непонятен. Вы спрашиваете, почему 'printf («% d », a);' (обратите внимание на ведущее пространство) печатает '20', хотя' int a = 30; 'появляется в той же области блока (хотя * после *) в качестве вышеупомянутого' printf')? – WhozCraig

ответ

0

Вы не объявить новую переменную во внутреннем блоке, вы просто называют переменную, которая была объявлена ​​ранее. Если вы измените код:

включают
int main(void) { 
    int a=0; 
    { 
     int a=10; 
     printf("%d",a); 
     a++; 
     { 
      int a=20; 
     } 
     { 
      printf(" %d",a); 
      int a=30; {a++;} 
      printf(" %d",a++); 
     } 
     printf(" %d",a++); 
    } 
    printf(" %d",a); 
    return 0; 
} 

Тогда вы получите вывод, который вы ожидаете. int a = 20 - это объявление, a = 20 - это просто задание.

1

a=20; заявление в своем собственном блоке рамки, однако a не была определена в этой области видимости, поэтому он ищет определение a в следующей внешней области. Здесь он находит a, который был инициализирован до 10, и устанавливает его на 20.

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