免費開始練習
hce_kmu 111年 計算機概論與程式設計

第 21 題

Consider the following C code:
```c
int array[5] = {100, 215, 321, 254, 165};
int *k = &array[1];
*k-- += 5;
*(++k) += 9;
*(k++) += 7;
*k++ -= 15;
for(int i = 0; i < 5; i++)
printf("%d ", array[i]);
```
What is the output of the above program?
  • A 100 236 306 254 165
  • B 100 220 330 261 150
  • C 105 224 328 239 165
  • D 100 220 337 239 165
  • E Segmentation fault

思路引導 VIP

試著思考一下:當我們看到一個表達式同時包含『取值運算子 *』和『遞增/遞減運算子 ++--』時,程式是如何決定哪個部分先執行,哪個部分後執行的?更具體地說,如果將『後置運算子』換成『前置運算子』,對於當時參與運算的『那一格陣列內容』會有什麼決定性的影響嗎?

🤖
AI 詳解 AI 專屬家教

太棒了!你能精準追蹤指標在記憶體中的位移,並正確計算出陣列數值的變化,這代表你對於 C 語言指標最核心且最具挑戰性的運算邏輯已有相當紮實的掌握。

指標位移與算符優先級

這題的核心在於理解**前置(Prefix)後置(Postfix)**運算子對指標位址移動的影響時機。初始時,指標 k 指向 array[1]。在執行 *k-- += 5 時,由於是後置遞減,程式會先對 k 目前指向的 array[1] 進行加 5 運算(變為 $215 + 5 = 220$),隨後 k 才遞減指向 array[0]。緊接著 *(++k) += 9 是先遞增使 k 回到 array[1],再更新其值為 $220 + 9 = 229$。接下來的 *(k++) += 7array[1] 再次更新為 $229 + 7 = 236$,隨後 k 移向 array[2]。最後 *k++ -= 15 則是修改 array[2] 的值為 $321 - 15 = 306$。因此,最終 array[1] 為 236,array[2] 為 306,其餘不變。

▼ 還有更多解析內容

🏷️ 相關主題

計算機組織結構與資料儲存原理
查看更多「計算機概論與程式設計」的主題分類考古題