[面試攻略] 技術性考題:i++和++i的差異

更新於 發佈於 閱讀時間約 7 分鐘

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。

關鍵差異總結

raw-image



效率考量

  • 後置遞增 (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++面試的基礎考點,理解它們的返回值和效率差異能展示你的程式設計能力。重點在於用簡單比喻(計數器)講解,並寫出乾淨的程式碼。練習時,熟悉基本型別和自定義類型的行為,並準備回答效率和未定義行為的問題。模擬面試時,練習邊寫邊說,清晰表達邏輯。祝你面試順利!



留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
9會員
142內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/05/16
函數指標(Function Pointer)是一個常見的技術面試題目,特別在C或C++相關的職位中,用來考驗你對程式設計中函數作為一等公民(first-class citizen)的理解,以及記憶體管理和程式控制流的掌握。
2025/05/16
函數指標(Function Pointer)是一個常見的技術面試題目,特別在C或C++相關的職位中,用來考驗你對程式設計中函數作為一等公民(first-class citizen)的理解,以及記憶體管理和程式控制流的掌握。
2025/05/10
在C++中,函數執行時的記憶體配置涉及程式如何在記憶體中儲存變數、參數和程式碼。這是面試常見題目,因為它直接關係到程式效率和資源管理。本文將介紹函數記憶體配置的基礎、C++程式碼範例、關鍵概念,以及面試答題技巧。
2025/05/10
在C++中,函數執行時的記憶體配置涉及程式如何在記憶體中儲存變數、參數和程式碼。這是面試常見題目,因為它直接關係到程式效率和資源管理。本文將介紹函數記憶體配置的基礎、C++程式碼範例、關鍵概念,以及面試答題技巧。
2025/05/02
矩陣相乘是一個經典的演算法問題,經常出現在技術面試中,用來評估你對多維陣列的操作和程式設計邏輯的掌握。本文將以標準矩陣相乘為例,介紹其基礎概念、Python程式碼、時間與空間複雜度,並提供面試應答技巧。
2025/05/02
矩陣相乘是一個經典的演算法問題,經常出現在技術面試中,用來評估你對多維陣列的操作和程式設計邏輯的掌握。本文將以標準矩陣相乘為例,介紹其基礎概念、Python程式碼、時間與空間複雜度,並提供面試應答技巧。
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
一、基本算術運算符號 加法:+ 減法:- 乘法:* 除法:/(返回浮點數) a = 1 b = 2 print( a + b ) # 加法 輸出:3 print( a - b ) # 減法 輸出:-1 print( a * b ) # 乘法 輸出:2 print( a / b ) #
Thumbnail
一、基本算術運算符號 加法:+ 減法:- 乘法:* 除法:/(返回浮點數) a = 1 b = 2 print( a + b ) # 加法 輸出:3 print( a - b ) # 減法 輸出:-1 print( a * b ) # 乘法 輸出:2 print( a / b ) #
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
Thumbnail
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News