У меня возникает несколько проблем, отслеживающих значения глобальных переменных, когда есть локальные переменные, которые существуют с тем же именем.Отслеживание глобальных переменных с тем же именем, что и локальные переменные в 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?
Было бы здорово, если бы кто-то мог пройти через этот выход и, возможно, дать мне краткое объяснение по сфере применения, а также по теневому экрану.
Вы никогда не объявляете 'y' в' func', поэтому ничего не затеняется. 'func (x)' в 'main' не теневая глобальная' x'. – mafso
Если вы действительно хотите угаснуть свой ум, добавьте '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() '. –