我想从函数访问分配给主函数中全局变量的值。我不想在函数中传递参数。
我尝试引用不同的堆栈溢出类似的问题并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
}
此外,在cin
中使用全局s
非常简单:
cin >> ::s;
cout << ::s << endl;
请在线试用
你在主函数中声明另一个变量 s。 代码的第 7 行。 它是 CIN 中使用的变量。 删除该行或在 s 之前使用 :。
long s;
cin >> ::s; //let it be 5
output();
重要的是要知道,在main()
中声明的局部s
变量和在文件范围内声明的变量s
尽管名称不同,但并不相同。
由于局部变量s
在函数中声明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()
}
。或者摆脱main()
的当地s
.
也就是说,使用全局变量(没有实际需要)被认为是非常糟糕的做法。请参阅什么是"静态初始化顺序'惨败'?"。虽然这不会影响 POD,但它迟早会咬你。
您可以简单地在全局变量之前使用::,或者只是删除
long s;
来自 main(),因为当您在 main() 函数中声明局部变量 s 时。全局 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()函数中调用全局变量。 您可以使用:: (范围解析运算符)在 main 中调用全局 x,如果您具有相同的命名,或者如果它们具有不同的名称,则仅通过变量名称调用它。
PS:如果您有任何问题,请发表评论,希望这会对您有所帮助并了解错误所在。在此处阅读有关局部变量和全局变量范围的更多信息
您在全局作用域上定义了 output(),这意味着它将引用全局作用域上的长 s 变量,而不是在 main() 中定义的长 s。
首先,当你声明一个全局变量而不赋值时,它会自动将其值设置为 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()
}