原住民族考試四等考試-電子工程類科 104 年 · 第 29 題 原住民族考試四等考試-電子工程類科 計算機概要 104 年 第 29 題 單選題
若執行以下 C 語言撰寫之程式,下列敘述何者正確?
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void funcA(void);
void funcB(void);
int a, b = 2;
int main(void) {
funcA();
printf(''%d, %d\n'', a, b);
funcB();
printf(''%d, %d\n'', a, b);
system(''PAUSE'');
return 0 ;
}
void funcA() {
int a;
a = 3;
}
void funcB() {
a = 3;
b = 4;
} A 呼叫 funcA()之後,輸出為 3,2 並跳行
B 呼叫 funcB()之後,輸出為 0,2 並跳行
C 呼叫 funcA()之後,輸出為 0,2 並跳行 正確答案
D 呼叫 funcB()之後,輸出為 3,2 並跳行
C 正確答案
funcA 內 a 是區域變數,不影響全域;funcB 直接改全域 a、b。故 funcA 後印 0,2;funcB 後印 3,4。
為什麼答案是 C 全域 int a 未初始化,預設為 0;b=2。funcA 內宣告的 a 是區域變數,不影響全域。故呼叫 funcA 後輸出 0,2 並換行,正確。
載入中…
完整詳解 Pro · 無限 重點 funcA 內 a 是區域變數,不影響全域;funcB 直接改全域 a、b。故 funcA 後印 0,2;funcB 後印 3,4。
看變數作用域:函式內重新宣告 int a → 區域變數;直接 a=3 → 改到全域。
逐選項分析 A ✕ 陷阱
funcA 內 `int a;` 是區域變數,a=3 只改區域 a,函式結束即消失。全域 a 仍為 0(未初始化之全域變數預設為 0),故輸出應為 0,2 而非 3,2。
B ✕
funcB 直接使用 a=3; b=4;,未重新宣告,所以操作的是全域變數。呼叫後全域 a=3、b=4,應輸出 3,4 而非 0,2。
C ✓ 正確
全域 int a 未初始化,預設為 0;b=2。funcA 內宣告的 a 是區域變數,不影響全域。故呼叫 funcA 後輸出 0,2 並換行,正確。
D ✕
funcB 同時修改全域 a 與 b,執行後 a=3、b=4,應輸出 3,4 而非 3,2。此選項誤以為 funcB 只改 a。
變數作用域對照 情境 宣告方式 影響範圍 本題結果 全域 a, b=2 檔案層級宣告 所有函式共用 a=0, b=2 funcA 內 int a 函式內重新宣告 僅限該函式 不影響全域 funcB 內 a=3 直接賦值未宣告 改到全域 全域 a 變 3 funcB 內 b=4 直接賦值未宣告 改到全域 全域 b 變 4
陷阱在 funcA 的 `int a;`——許多考生忽略這行,誤以為 a=3 改的是全域 a(選 A)。其實一旦函式內重新宣告同名變數,就會遮蔽(shadow)全域變數,函式結束後區域 a 消失,全域 a 仍是預設值 0。