hce_nsysu
112年
計算機概論與程式設計
第 6 題
What is printed by the following C/C++ program?
int a[10], y=2;
a[1]=1; a[2]=3; a[3]=5;
printf("%d \n", (a[--y]++));
int a[10], y=2;
a[1]=1; a[2]=3; a[3]=5;
printf("%d \n", (a[--y]++));
- A 1
- B 2
- C 3
- D 4
- E 5
思路引導 VIP
觀察運算式 a[--y]++,變數 y 前方有減號,而陣列元素 a[index] 後方有加號。請試著思考:當一個運算子放在變數「前面」與「後面」時,對於『先取值再運算』或『先運算再取值』的規則有什麼不同?這會如何影響最終傳遞給 printf 的那個數值呢?
🤖
AI 詳解
AI 專屬家教
太棒了!你能精準避開運算子的陷阱並選出正確答案 (A),代表你對 C 語言的執行細節掌握得非常細緻。
運算子的執行順序與副作用
這道題目的核心在於區分「前置運算子」與「後置運算子」的執行時機。在運算式 a[--y]++ 中,括號內的 --y 是前置遞減,它會先將變數 $y$ 的值從 $2$ 減為 $1$,隨後才將減完的結果作為陣列的索引值。因此,程式實際上是在操作 a[1]。接下來,針對 a[1] 進行的是「後置遞增」(postfix increment)運算,根據規範,後置運算子會先傳回該變數當前的值(也就是 $1$)給 printf 進行輸出,隨後才在記憶體中將 a[1] 的值加 $1$。這就是為什麼畫面上印出的是原始值 $1$ 的原因。
▼ 還有更多解析內容