企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 【选择测试】变量的作用域 ## Part1 在之前的课程内容中,我们学习了变量的概念,接下来我们将对变量可以被使用的范围 —— 作用域进行了解释。我们说,我们可以简单的理解一个变量的 **作用域(scope)** 一般可以被界定为变量声明语句之后、包裹了它的声明语句的最内一层 `{}` 之内。例如下图中,对于变量 `alpha`,图中的绿色标记了包裹了它的声明语句的最内一层 `{}` 所在的区域;而黄色的箭头标记出了自它声明后,它的实际作用域范围(也就是作用域)。 这里我们只做一个简单的介绍——对于 C++ 的 **命名空间**,在后续课程中我们会进一步地展开讨论。 [![作用域](https://res.jisuanke.com/img/upload/9fe424620308e1c185c19fcb10710041ececaf43.png)](https://res.jisuanke.com/img/upload/9fe424620308e1c185c19fcb10710041ececaf43.png) 读一下下面这个 C++ 语言程序,选出关于这个程序描述的所有正确选项(请注意,如果输出格式的引号中有 `\n`,程序输出的位置将换行)。 ~~~ #include <iostream> using std::cout; using std::endl; int main() { int year; year = 2011; { int month; month = 5; cout<<year<<" 年 "<<month<<" 月"<<endl; year = 2016; } int month; month = 3; cout<<year<<" 年 "<<month<<" 月"<<endl; return 0; } ~~~ A. 输出第一行是 `2011 年 5 月` > 第一个变量 `year` 的在声明后,在第 6 行被赋值为 `2011`。第一次输出时它的值是 `2011`。这里输出的 `month` 来自第 8 行的声明,它的值则是在第 9 行的赋值中获得。 B. 这个程序将会出错,因为 `month` 这个变量被声明了两次。 > 这个给出的程序中第一个 `month` 变量并不会在第 12 行的右大括号后产生任何作用。所以之后声明的第二个 `month` 变量并不会与前一个 `month` 冲突。 C. 输出第二行是 `2016 年 3 月` > 第一个变量 `year` 的在声明后,在第 6 行被赋值为 `2011`,第 11 行被再次赋值成了 2016(请注意这里 `year` 的赋值依然是发生在 year 作用域内的)。这里输出的 `month` 来自第 13 行的声明,它的值则是在第 14 行的赋值中获得,和第 9 行声明的 `month` 完全无关。 D. 如果去掉第 7 行的左大括号和第 12 行的右大括号,这个程序将会出错。 > 如果去掉了这一对大括号,程序中第二个 `month` 变量的声明发生在程序中第一个 `month` 变量的作用域内,这就会违背我们已经学过的“作用域内的多个变量不可使用相同的变量名”的要求了。在程序编译时将会报错。 E. 第二处输出使用的变量 `month` 来自于第 8 行的声明,它的值在第 14 行的赋值中获得。 > 第二处输出使用的变量 `month` 来自第 13 行的声明;第 9 行声明的 `month` 的作用域已经在第 12 行终结。 正确答案:ACD