Как я могу получить доступ к глобальной переменной с помощью функции в C ++? - PullRequest
1 голос
/ 18 мая 2019

Я хочу получить доступ к значению, назначенному глобальной переменной в основной функции из функции. Я не хочу передавать аргумент в функцию.

Я пытался ссылаться на похожие вопросы о переполнении стека и библиотеках C ++.

#include <iostream>

long s;  // global value declaration

void output()  // don't want to pass argument
{
    std::cout << s;
}

int main()
{
    long s;
    std::cin >> s;  // let it be 5
    output()
}

Я ожидаю, что результат будет 5, но он показывает 0.

Ответы [ 5 ]

4 голосов
/ 18 мая 2019

Для доступа к глобальной переменной вы должны использовать знак :: перед ней:

long s = 5;          //global value definition

int main()
{
    long s = 1;              //local value definition
    cout << ::s << endl;     // output is 5
    cout << s << endl;       // output is 1
}

Также так просто использовать глобальные s в cin:

cin >> ::s;
cout << ::s << endl;

Пожалуйста попробуйте онлайн

2 голосов
/ 18 мая 2019

Вы объявляете другую переменную s в своей основной функции. строка 7 вашего кода. и это переменная, которая используется в CIN. либо удалите эту строку, либо используйте :: before s.

long s;
cin >> ::s; //let it be 5
output();
1 голос
/ 18 мая 2019

Важно знать, что локальная переменная s, объявленная в main(), и переменная s, объявленная в области видимости файла, не идентичны, несмотря на имя.

Поскольку локальная переменная s объявлена ​​в функции main() shadows (см. Область действия - скрытие имени ) глобальной переменной s, вам необходимо использовать Оператор разрешения области :: для доступа к глобальной переменной s, объявленной в области действия файла:

#include <iostream>

long s;

void output()
{
    std::cout << s;   // no scope resolution operator needed because there is no local
}                     // s in output() shadowing ::s

int main()
{
    long s;           // hides the global s
    std::cin >> ::s;  // qualify the hidden s
    output()
}

... или избавиться от местного s в main().

При этом использование глобальных переменных (без реальной необходимости) считается очень плохой практикой. См. Что такое «статический порядок инициализации« фиаско »? * . Хотя это не влияет на POD s, оно рано или поздно укусит вас.

0 голосов
/ 18 мая 2019

Вы можете просто сделать и использовать :: перед глобальной переменной или просто удалить

long s; 

Из main () потому что вы объявляете локальную переменную s в функции main (). Глобальные s и локальные s отличаются, несмотря на то, что имеют одно и то же имя. давайте узнаем больше на следующем примере, присвоив локальной и глобальной переменной разные имена.

    #include <iostream>

long x;  // global value declaration

void output()  // don't want to pass argument
{
    std::cout << x;
}

int main()
{
    long s;
    std::cin >> s;  //here you are storing data on local variable s
    output() // But here you are calling global variable x. 
}

В main () функция s является локальной, а x является глобальной переменной, и вы вызываете глобальную переменную в функции output (). Вы можете использовать :: (оператор разрешения области видимости) для вызова глобального x в main, если у вас такое же имя, или просто вызывать его по имени переменной, если у них другое имя.

PS: Если у вас есть какие-либо вопросы, просто прокомментируйте, надеюсь, это поможет вам и поймете, в чем ошибка. Подробнее о области действия локальной и глобальной переменной здесь

0 голосов
/ 18 мая 2019

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

И еще одна вещь, которую вы должны знать о своей области видимости.Переменная s в вашей основной функции не существует в выходной функции.

В выходной функции вы получаете 0, потому что ваша глобальная переменная установлена ​​в 0.

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

long s; //global value declaration
void output() //don't want to pass argument
{
   cout<<s;  
}
int main()
{
   cin>>s; //let it be 5
   output()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...