2015-03-23 4 views
-1

У меня возникает несколько проблем, отслеживающих значения глобальных переменных, когда есть локальные переменные, которые существуют с тем же именем.Отслеживание глобальных переменных с тем же именем, что и локальные переменные в C

Это код, я работаю с:

#include <stdio.h> 

void func(int); 

int x=6, y=7, z=10; 

int 
main(int argc, char **argv) { 
    int z=5; 
    printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z); 
    func(x); 
    printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z); 
    func(y); 
    printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z); 
    func(z); 
    printf("main: x=%2d, y=%2d, z=%2d\n", x, y, z); 
    return 0; 
    } 

void 
func(int x) { 
    x = x+1; 
    y = y+1; 
    printf("func: x=%2d, y=%2d, z=%2d\n", x, y, z); 
} 

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

main: x= 6, y= 7, z= 5 
func: x= 7, y= 8, z=10 
main: x= 6, y= 8, z= 5 
func: x= 9, y= 9, z=10 
main: x= 6, y= 9, z= 5 
func: x= 6, y=10, z=10 
main: x= 6, y=10, z= 5 

Я могу понять, откуда начинается первая линия. Это всего лишь значения глобальных переменных, но main использует 5, а не 10, потому что глобальная переменная затеняет локальную переменную. Я также могу понять строку 2. Глобальная переменная x передается в func, давая 7. Глобальная переменная y также используется, давая 8.

Строка 3 - это то, где я теряю дорожку значений. Почему значение глобальной переменной y оставалось равным 8? Вызывает ли функция func() ее значение постоянно? Я думал, что это невозможно, так как y в func() является только локальной переменной. Я понимаю, где x = 6 происходит из строки 3.

Линия 4 Я теряю след еще больше. Как значение x может перейти от 6 до 9?

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

+0

Вы никогда не объявляете 'y' в' func', поэтому ничего не затеняется. 'func (x)' в 'main' не теневая глобальная' x'. – mafso

+1

Если вы действительно хотите угаснуть свой ум, добавьте 'printf (" main: x =% 2d, y =% 2d, z =% 2d \ n ", x, y, z);' перед объявлением 'int z = 5 ; 'в' main() '(предполагая поддержку C99 или более поздней) и добавляем:' {int z = 20; printf ("main: x =% 2d, y =% 2d, z =% 2d \ n", x, y, z); } 'тоже, после одного из других вызовов' printf() '. –

ответ

1

y не является локальной переменной внутри func(). Для того, чтобы это была локальная переменная (которая затеняет глобальную переменную y), вам придется объявить другую переменную y внутри func(), например. как в примере ниже. (Эта версия всегда будет печатать «у = 1», и не будет изменять глобальную переменную y.)

void 
func(int x) { 
    int y = 0; 

    x = x+1; 
    y = y+1; 
    printf("func: x=%2d, y=%2d, z=%2d\n", x, y, z); 
} 

Поскольку y не является локальной переменной внутри исходного func(), это увеличивающиеся глобальный y.

Отметьте, что x также является местным для func() и передается по значению. То есть, вызов func(foo) скопирует значение foo в параметр x, и изменение параметра x внутри func() воли не изменений foo.

Строка 4 исходит от звонка func(y). Он установит (локальный) параметр x внутри func() на текущее значение глобальной переменной y. y имеет значение 8 в этой точке. (Он был увеличен с 7 до 8 по предыдущему вызову до func().) Назначение x = x+1 внутри func() шишки, которые до 9, которые затем печатаются.

2

Чтобы ответить на ваш первый вопрос

Почему значение глобальной переменной у остался в 8? Вызывает ли функция func() ее значение постоянно?

Да это действительно изменить глобальную переменную y на постоянной основе, так как она носит глобальный характер и не местные (было бы локальным, если он был объявлен как int y;)

Как можно значение х скачка от 6 до 9?

Вы передаете глобальную переменную y, которая сменится на 8 в первом вызове функции. Это значение локально сохраняется в функции как x. Таким образом, x + 1 станет 9.

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

Небольшой пример, чтобы объяснить некоторые детали:

int x = 3; 

int main(){ 
    int x = 8; 
    printf("%d", x); 
} 

Это будет печатать 8, потому что код будет захватывать локальное значение x.

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

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