# 【選擇測試】變量的作用域
## Part1
在之前的課程內容中,我們學習了變量的概念,接下來我們將對變量可以被使用的范圍 —— 作用域進行了解釋。我們說,我們可以簡單的理解一個變量的 **作用域(scope)** 一般可以被界定為變量聲明語句之后、包裹了它的聲明語句的最內一層 `{}` 之內。例如下圖中,對于變量 `alpha`,圖中的綠色標記了包裹了它的聲明語句的最內一層 `{}` 所在的區域;而黃色的箭頭標記出了自它聲明后,它的實際作用域范圍(也就是作用域)。
這里我們只做一個簡單的介紹——對于 C++ 的 **命名空間**,在后續課程中我們會進一步地展開討論。
[](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
- 教材介紹
- 《編程初學入門常識》
- 什么是程序語言
- 【知識精講】編程與編程語言
- 【選擇測試】編程語言分類
- 【知識精講】高級語言分類
- 【選擇測試】編譯與解釋
- 【選擇測試】程序員笑話-Java
- 熟悉鍵盤上用于編程的鍵位
- 【知識精講】認識你的鍵盤
- 【知識精講】中文和英文字符
- 【匹配測試】識別中英文符號
- 【選擇測試】中英文符號的影響
- 【伴隨編程】不要使用中文引號
- 【伴隨編程】不要使用中文分號
- 【伴隨編程】正確地輸入符號
- 【選擇測試】找出程序中的錯誤
- 初始工程師思維
- 【知識精講】二進制思想
- 【選擇測試】程序員笑話-湊整
- 【知識精講】閉合的邏輯
- 【選擇測試】程序員笑話-條件
- 程序員職業與生活
- 【知識精講】程序員的發展方向
- 【知識精講】程序員的裝備
- 【知識精講】程序員的健康
- 【選擇測試】做一名健康的程序員
- 《C++程序設計》
- 前言
- 【知識精講】編程與計算機科學
- 【知識精講】編程與軟件工程
- 【知識精講】如何學習編程
- 你好C++
- 【知識精講】你好,C++
- 【知識精講】C++程序是如何開發的
- 【知識精講】成為一名Power User
- 【伴隨編程】讓我們一起說你好
- 【知識精講】你的第一個C++語言程序
- 【伴隨命令】編譯、運行你的程序
- 【伴隨編程】將變量流式輸出
- 【選擇測試】變量的作用域
- 【知識精講】變量與數據類型
- 【匹配測試】C++語言的入門概念
- 【知識精講】在程序中學會換行
- 【選擇測試】正確地換行
- 簡單數學運算
- 【知識精講】重新認識基本運算
- 【選擇測試】運算符的理解
- 【伴隨編程】做一下簡單的運算
- 【伴隨編程】a 的 n 次方
- 【知識精講】數學函數
- 【伴隨編程】讓C++語言變成計算器
- 【伴隨編程】計算球的體積
- 【匹配測試】數學世界知多少
- 【知識精講】在程序中添加注釋
- 【選擇測試】正確地寫注釋
- 從伴隨輸入到變量地址
- 【伴隨編程】 一個數字復讀機器
- 【選擇測試】理解標準輸入輸出
- 【伴隨編程】一個加法計算器
- 【程序設計】A+B+C問題
- 【伴隨編程】簡單的I/O格式控制
- 【知識精講】地址與取地址符
- 【伴隨編程】看看我們的地址
- 習題一:面積與周長
- 【程序設計】矩形面積與周長
- 【程序設計】三角形面積與周長
- 【程序設計】圓形面積與周長
- 程序中的是與非
- 【知識精講】是非的表示與關系運算
- 【伴隨編程】驗一驗關系運算式
- 【選擇測試】關系運算式求值
- 【知識精講】如果的意義
- 【伴隨編程】分段函數求值
- 【知識精講】如果之后的如果
- 【伴隨編程】五則運算器
- 【選擇測試】分支的嵌套
- 【伴隨編程】問號表達式
- 【知識精講】是非之間的邏輯組合
- 【伴隨編程】判斷閏年
- 【程序設計】日期合法性
- 【知識精講】多路順序結構
- 【知識精講】在程序中學會縮進
- 【選擇測試】正確的縮進
- C++程序中的苦力
- 【知識精講】使用循環結構
- 【選擇測試】對比兩種循環
- 【伴隨編程】使用while循環
- 【填空測試】理解循環結構
- 【知識精講】自減和自增運算符
- 【伴隨編程】使用自增運算符
- 【知識精講】for循環
- 【選擇測試】for循環的使用
- 【程序設計】一大波好玩兒的程序
- 《代碼能力快速提升》
- 《基礎數據結構》
- 《搜索入門》
- 《動態規劃基礎》
- 《數論和基礎數學》
- 《圖和數基礎》