2015-12-23 1 views
1

У меня есть как локальная, так и глобальная переменная с тем же именем.Глобальная и локальная переменная с тем же именем, неожиданное значение

int var = 10; 
int main() { 
    int var = var; 
    printf("%d", var); 
    return 0; 
} 

Запуск программы дает следующий результат: 0

Почему это?

+0

локальное определение переопределяет внешний. Это в локальном масштабе. Как мог компилятор узнать, что это? –

+0

Мне нужно задаться вопросом, как вы пропустили: *** «Предупреждение: переменная« var »не инициализируется при использовании в рамках собственной инициализации« ***. – user3386109

+0

А также ** предупреждение: объявление затеняет переменную в глобальной области видимости **. –

ответ

2

int var = var в main() фактически не имеет доступа к var в объеме файла.

В результате на самом деле не определено поведение, так как он пытается получить доступ к значению локального var, который не был инициализирован. Таким образом, любой результат, который вы получаете (ноль, 42, переформатирование вашего жесткого диска), действительно.

Попробуйте создать свой код с помощью другого компилятора, и вы можете получить другой результат.

Из любопытства я скомпилировал, построил и выполнил тот же код (кроме добавления #include <stdio.h>), и полученный результат был 41944322. Компилятор моей текущей машины - gcc 4.8.1 (mingw).

3

Глобальная переменная не имеет к этому никакого отношения, вы можете прокомментировать эту строку кода. Когда компилятор находит локальную переменную с тем же именем, что и переменная в другой, внешняя область, локальная переменная всегда будет использоваться.

Следовательно, оба выражения "var" в выражении int var = var; ссылаются на себя: локальная переменная. Не имеет смысла инициализировать переменную своим собственным неинициализированным значением. Значение останется неопределенным, и когда вы используете значение в своей программе, вы вызываете неопределенное поведение: все может случиться.

+0

Технически компилятор обнаружил 'var' в * той же * области. Неопределенное поведение вызывается самим инициализатором и снова в 'printf'. – chqrlie

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