農會 資訊管理類程式設計110 年第 19 題單選題
以下為C語言程式,請問執行後的結果,下列何者正確?
#include <iostream>
using namespace std;
int main()
{
int a=3, b=8;
if (a>2) int a=5;
else b=7;
}
B、C正確答案
if 敘述無大括號時,內部宣告的變數僅具區塊作用域,結束後即銷毀,不影響外層同名變數;因 a>2 為真,else 不執行,故 a=3、b=8 皆維持初值。
為什麼答案是 B、C
外層 a 初始為 3,未受 if 內層同名變數影響,最終值仍維持為 3。
考點:區塊作用域考點:變數生命週期考點:條件判斷
載入中…
完整詳解
Pro · 無限重點 if 敘述無大括號時,內部宣告的變數僅具區塊作用域,結束後即銷毀,不影響外層同名變數;因 a>2 為真,else 不執行,故 a=3、b=8 皆維持初值。
看到 if (a>2) 後面直接 int a=5 沒加 {},就知道這是個短命變數!外層 a 沒被改到仍為 3;又因條件成立跳過 else,b 也維持 8,故選 B、C。
逐選項分析
A區塊作用域✕ 陷阱
if 內宣告的 a 為區塊變數,該敘述本身自成一個作用域,離開後即銷毀,外層 a 不會變成 5。
B變數生命週期✓ 正確
外層 a 初始為 3,未受 if 內層同名變數影響,最終值仍維持為 3。
C條件判斷✓ 正確
a>2 條件成立(3>2),不執行 else 區塊,故 b 維持初始值 8。
D條件判斷✕
因 a>2 為真,else 敘述被跳過不執行,b 不會被重新賦值為 7。
變數作用域與最終值分析
| 變數 | 宣告位置 | 作用域範圍 | 最終值 |
|---|
| 外層 a | main 函式開頭 | 整個 main 函式 | 3 |
| 內層 a | if 敘述內部 | 僅限 if 該行區塊 | 5 (隨後銷毀) |
| 變數 b | main 函式開頭 | 整個 main 函式 | 8 |
考生易誤以為 int a=5 會覆蓋外層的 a。實際上,if 後的單行敘述會形成一個隱含的區塊作用域,宣告的變數在該行結束後立即銷毀,外層變數完全不受影響。此外注意本題以 iostream 但用 C 風格撰寫,屬 C++ 編譯環境。