2017-02-02 4 views
0

У меня есть этот кусок кода:переменная Access, которая была перезаписана в заданной области с помощью функции, которая использует глобальные переменные

#include <stdio.h> 

// global variable definition 
int x = 0; 

void access_global(){ 
    cout << "ACCESSING FROM access_global()" << endl; 
    if (x > 0){ 
     cout << "LOCAL VARIABLE" << endl; 
     cout << x << endl; 
    } 
    else{ 
     cout << "GLOBAL VARIABLE" << endl; 
     cout << x << endl; 
    } 
} 


int main(int, char*[]) 
{ 
    // declare new variable in given scope with same name as global variable 
    int x = 1; 

    cout << "ACCESSING FROM main()" << endl; 
    if (x > 0){ 
     cout << "LOCAL VARIABLE" << endl; 
     cout << x << endl; 
    } 
    else{ 
     cout << "GLOBAL VARIABLE" << endl; 
     cout << x << endl; 
    } 

    access_global(); 

    return 0; 
} 

Он выводит:

ACCESSING FROM main() 
LOCAL VARIABLE 
1 
ACCESSING FROM access_global() 
GLOBAL VARIABLE 
0 

Почему access_global() не имеет доступа x в main() объем? Возможно ли изменить функцию access_global(), чтобы она отображала первичные переменные x от области main(), и если они не определены, то отображаются те, которые определены за пределами main()? Если вы не можете объяснить, почему? Благодаря

+0

уточните, почему я был проголосован. Спасибо –

+0

Локальные переменные внутри функции или if/else, петли не могут быть доступны извне. Это не похоже на пространства имен. – Raindrop7

+0

@ Raindrop7 Что вы подразумеваете под словом «это не похоже на пространства имен». Можете ли вы опубликовать какую-либо ссылку или пояснить это в ответ? –

ответ

0

Почему access_global() не имеет доступа x в main() объеме?

Потому что main::x не входит в число access_global. К счастью, имена не просто «просачиваются» из областей функций. Глобальный x является единственным x, который он может видеть.

Можно ли изменить access_global() функцию, которая будет показывать первичные x переменные из main() сферы, и если они не определены, то показать, определенные вне main()?

Не так, как вы надеетесь, нет. Имена в main не связаны с именами в access_global в любом смысле.

Если не возможно, не могли бы вы объяснить, почему?

Как обычно: поскольку стандарт говорит так. Почему это связано с некоторыми спекуляциями, но это, безусловно, было бы чрезвычайно запутанным, если значение какой-либо функции изменилось в зависимости от того, какие имена существуют в вызывающем контексте, то, что вы обычно не контролируете при написании функции.

Только подумайте, что бы произошло, если бы access_global называли когда-то из функции, которая имеет некоторые x, возможно, даже не типа int, и один раз из некоторой функции, которая не имеет локальный x: Вы не могли предсказать, что функция делает даже не глядя на всех абонентов. Это очень непрактично.

+0

Downvoter, что вы думаете не так здесь? –

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