i++
(後置遞增)和++i
(前置遞增)是C++中用來增加變數值的運算子,兩者在功能上相似但行為有細微差異。這個問題經常出現在技術面試中,因為它涉及運算子的返回值和執行效率。以下將以淺顯的方式解釋它們的差異、提供C++程式碼範例,並分享面試答題技巧。
i++
和 ++i
的基礎
- 共同點:
- 兩者都將變數 i 的值增加 1(例如,i 從 5 變成 6)。
- 適用於整數、浮點數或指標。
- 差異:
- 返回值:i++ 返回遞增前的值,++i 返回遞增後的值。
- 執行順序:i++ 先返回舊值再遞增,++i 先遞增再返回新值。
簡單比喻
想像你有一個計數器:
- i++ 像先把當前數字給別人看(返回舊值),然後悄悄加 1。
- ++i 像先加 1,然後把新數字給別人看(返回新值)。
程式碼範例
以下C++程式展示i++
和 ++i
的行為:#include <iostream>
using namespace std;
int main() {
int i = 5;
// 測試 i++
int post = i++; // post 得到 i 的舊值,然後 i 遞增
cout << "i++: post = " << post << ", i = " << i << endl;
// 輸出: i++: post = 5, i = 6
// 重置 i
i = 5;
// 測試 ++i
int pre = ++i; // i 先遞增,pre 得到 i 的新值
cout << "++i: pre = " << pre << ", i = " << i << endl;
// 輸出: ++i: pre = 6, i = 6
return 0;
}
程式碼解釋
- 後置遞增 (i++):
- post = i++:先將 i 的值(5)賦給 post,然後 i 增加到 6。
- 結果:post = 5, i = 6。
- 前置遞增 (++i):
- pre = ++i:先將 i 增加到 6,然後將新值(6)賦給 pre。
- 結果:pre = 6, i = 6。
關鍵差異總結

效率考量
- 後置遞增 (i++):
- 在C++中,i++ 需創建臨時物件儲存舊值(對於基本型別如 int 通常被編譯器優化)。
- 對於自定義類型(例如,迭代器),可能有額外開銷。
- 前置遞增 (++i):
- 直接修改並返回新值,無需臨時物件,效率較高。
- 建議:在不需要舊值時,優先使用 ++i。
範例:自定義類型
#include <iostream>
using namespace std;
class Counter {
int value;
public:
Counter(int v) : value(v) {}
// 前置遞增
Counter& operator++() {
value++;
return *this;
}
// 後置遞增
Counter operator++(int) {
Counter temp = *this; // 儲存舊值
value++;
return temp; // 返回舊值
}
int getValue() const { return value; }
};
int main() {
Counter c(5);
cout << (++c).getValue() << endl; // 輸出: 6 (前置)
cout << c++.getValue() << endl; // 輸出: 6 (後置,返回舊值)
cout << c.getValue() << endl; // 輸出: 7 (i 已遞增)
return 0;
}
面試應答策略
- 理解題目:
- 確認上下文(i 是基本型別如 int,還是自定義類型?)。
- 問清楚是否需要討論效率或特定場景(迴圈、賦值)。
- 確認語言(C++與Java的行為略有不同,Java無運算子重載)。
- 講解思路:
- 用比喻(計數器)簡單說明 i++ 返回舊值,++i 返回新值。
- 畫圖展示執行順序(例如,i++:返回 5 -> i 變 6)。
- 提到效率差異:++i 通常更快,特別在自定義類型中。
- 程式碼實現:
- 寫簡單範例(如第一個程式碼),展示 i++ 和 ++i 的返回值。
- 註釋關鍵行為(舊值 vs 新值)。
- 如果問到自定義類型,展示運算子重載(如第二個程式碼)。
- 進階討論:
- 提到編譯器優化:對於 int,i++ 和 ++i 在單獨使用時無差別(例如,for 迴圈)。
- 討論實際應用:
- i++:常用於迴圈(for (int i = 0; i < n; i++))。
- ++i:用於需要新值的賦值或迭代器。
- 提到C++與其他語言的區別(Python無 ++ 運算子,Java不支援運算子重載)。
- 常見追問:
- 「i++ 和 ++i 在迴圈中有差別嗎?」回答:單獨使用時無差別(編譯器優化),但 ++i 更通用且效率稍高。
- 「為什麼 i++ 可能較慢?」回答:因需儲存舊值副本,特別在自定義類型中(需創建臨時物件)。
- 「如何避免未定義行為?」回答:避免在同一語句中多次修改 i(如 i = i++ + ++i),因順序未定義。
- 模擬面試準備:
- 練習手寫範例,展示 i++ 和 ++i 的返回值。
- 在LeetCode練習涉及運算子的題目(例如,陣列或指標操作)。
- 模擬白板環境,邊寫邊講解,練習清晰表達。
- 熟悉C++運算子重載,準備回答自定義類型問題。
注意陷阱
- 未定義行為:在同一語句中多次使用 i++ 或 ++i(如
printf("%d %d", i++, ++i)
)可能導致未定義行為,因編譯器決定執行順序。 - 自定義類型:面試官可能要求實現運算子重載,需展示 i++ 返回臨時物件,++i 返回自身。
結語
i++
和 ++i
的差異是C++面試的基礎考點,理解它們的返回值和效率差異能展示你的程式設計能力。重點在於用簡單比喻(計數器)講解,並寫出乾淨的程式碼。練習時,熟悉基本型別和自定義類型的行為,並準備回答效率和未定義行為的問題。模擬面試時,練習邊寫邊說,清晰表達邏輯。祝你面試順利!