c++ - C++主函数中变量的作用域是什么?
问题描述
假设我在 C++ 中有 main 函数,并声明了一个向量:
int main()
{
vector<int> arr (10, 5);
for (auto num : arr)
{
cout << num << endl;
}
}
根据我对范围的理解,该变量可以从定义它的任何地方访问,一直到定义它的环境的右括号。所以在这里,arr 可以在 main() 中的任何地方访问,因此它在for 循环。
但是,现在说我定义了一个函数并在 main 中调用该函数。
int main()
{
vector<int> arr (10, 5);
func();
}
void func()
{
arr.push_back(1);
}
现在,arr 在 func() 中是未定义的。我理解为什么会这样,因为严格来说,数组没有在 func() 范围内的任何地方定义。我意识到我们必须将 arr 作为参数传递给 func() 才能使其正常工作。但这与我对上面定义的范围的理解相冲突,在 main 中的任何地方都可以访问 arr,并且由于在 main 中调用了 func(),为什么它不能访问 arr?
补充:我已经在 JS 中开发了一段时间,所以我已经习惯了这种嵌套函数的模式:
function main() {
let a = 5;
function nested() {
console.log(a)
}
}
在这里, a 可以在嵌套函数中访问。
解决方案
在 C++ 中,变量的可见性{}
在它被声明的地方。可以创建全局变量,但您需要在文件顶部声明它。如果要编写主体函数,首先需要告诉该函数将存在。
void func();
vector<int> arr (10, 5);
int main()
{
func();
}
void func()
{
arr.push_back(1);
}
编辑:
但这是一种不好的做法,建议使用参考。
void func(vector<int> &arr);
int main()
{
vector<int> arr (10, 5);
func(arr);
}
void func(vector<int> &arr)
{
arr.push_back(1);
}
推荐阅读
- spring - 在 Spring + Thymeleaf 3.0.12+ 中保留换行符
- python - 在 django FileNotFoundError 上运行 collectstatic 时出错:
- excel - 使用 VBA 从 pdf 导出到 excel
- python - 滚动通过封装的 QScrollArea() 时错过了小部件的 leaveEvent()
- flutter - 在构建功能之外使用构建上下文的正确方法是什么
- google-cloud-platform - 如何让wireguard解析谷歌计算引擎上的内部dns名称
- pandas - GCP AI 笔记本中缺少 xlrd
- bash - Makefile:如何运行 bash 脚本并忽略其退出状态?
- java - firebase 不显示来自editText的文本
- ruby-on-rails - 如何将 Tailwind 2.0 安装到现有项目 (rails 6.1)