我想从函数中访问主函数中分配给全局变量的值。我不想在函数中传递参数。
我尝试过引用不同的堆栈溢出类似问题和 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
。
要访问全局变量,您应该在其前面使用
::
符号:
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;
请在线尝试
您正在主函数中声明另一个变量 s 。代码的第 7 行。这是 cin 中使用的变量。删除该行或在 s 之前使用 :: 。
long s;
cin >> ::s; //let it be 5
output();
重要的是您要知道,在
s
中声明的局部变量 main()
和在文件范围内声明的变量 s
尽管名称不同,但并不相同。
由于在函数
s
shadows中声明了局部变量
main()
(请参阅范围 - 名称隐藏)全局变量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,但它迟早会咬你。
long s;
来自 main() 因为您在 main() 函数中声明局部变量。尽管名称相同,但 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,或者如果它们具有不同的名称,则可以通过变量名称调用它。
另一件事,你应该了解你的范围。主函数中的变量 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()
}