我想从功能访问分配给主要功能中全局变量的值。我不想在函数中传递参数。
我尝试引用不同的堆栈溢出类似的问题和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
。
答案 0 :(得分:4)
要访问全局变量,应在其前使用::
符号:
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;
答案 1 :(得分:2)
您要在主函数中声明另一个变量s。您的代码的第7行。这是cin中使用的变量。要么删除该行,要么在之前使用::。
long s;
cin >> ::s; //let it be 5
output();
答案 2 :(得分:1)
重要的是,您要知道s
中声明的局部变量main()
和在文件作用域中声明的变量s
尽管名称不相同。
由于在函数s
中声明了局部变量main()
,所以阴影(请参见Scope - Name Hiding)是全局变量s
,因此您必须使用Scope Resolution Operator ::
访问在文件作用域声明的全局变量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()
。
也就是说,使用全局变量(无实际需要)被认为是非常不好的做法。参见What’s the “static initialization order ‘fiasco’?。虽然这不会影响POD s,但迟早会咬你。
答案 3 :(得分:0)
您可以简单地在全局变量之前使用::或删除
long s;
来自main(),因为在main()函数中声明局部变量s时。尽管具有相同的名称,但Global和local有所不同。通过为本地变量和全局变量指定不同的名称,可以通过以下示例了解更多信息。
#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()函数中调用全局变量。如果您使用相同的命名,则可以使用::(作用域分辨率运算符)在main中调用全局x,或者如果它们使用不同的名称,则可以通过变量名调用全局x。
PS: 如果您有任何疑问,请写下来,希望这对您有所帮助,并了解错误所在。详细了解局部变量和全局变量here
的范围答案 4 :(得分:-1)
首先,当您声明全局变量而不分配值时,它将自动将其值设置为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()
}