我通过加速C++工作我的方式,现在,我遇到的有关范围和代码块对我而言缺乏基本的了解。为什么我可以在较小范围内重新定义一个常量?
有一个锻炼章1月底想要你来决定这些代码是否会运行:
#include <iostream>
#include <string>
int main()
{
{
const std::string s = "a string";
std::cout << s << std::endl;
{
const std::string s = "another string";
std::cout << s << std::endl;
}
}
return 0;
}
我肯定不会,但它确实。我的业余爱好编程经验是,块中声明的变量可用于包含在其中的其他块,但不包括其外部的块。
而且必须至少为一半,因为删除s的第二个声明会输出“一个字符串”两次,给我的印象是第二个块中声明的s也存在于第三个块中。
我还试图完全移除所述第三块的大括号,导致编译错误我预期在首位。但是,与第三块范围内已经存在的常量声明有什么不同呢?如果在较小的范围内没有第二个声明,那么常量的声明是否只能传递到较小的范围?
我通过这本书直到这一点的一切又理了一遍,看看是否我错过了什么,但我不能找到变量和常量声明是如何被大括号影响的任何信息。
尝试在前两个'}'之间添加另一个'std :: cout << s << std :: endl;' – Caleth
第二个's'是一个新的变量,它会影响外部作用域中的一个。它也可以有不同的类型。 – teivaz
寻找的关键词是:_shadowing_。嵌套作用域中的's'会隐藏上部作用域中的一个。 –